diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/configs/Easyship-improved.txt b/configs/Easyship-improved.txt old mode 100644 new mode 100755 diff --git a/configs/Easyship.txt b/configs/Easyship.txt old mode 100644 new mode 100755 diff --git a/configs/bike.txt b/configs/bike.txt old mode 100644 new mode 100755 diff --git a/configs/bike_full.txt b/configs/bike_full.txt old mode 100644 new mode 100755 diff --git a/configs/bike_tot.txt b/configs/bike_tot.txt old mode 100644 new mode 100755 diff --git a/configs/chair.txt b/configs/chair.txt old mode 100644 new mode 100755 diff --git a/configs/chess.txt b/configs/chess.txt old mode 100644 new mode 100755 diff --git a/configs/chess_full.txt b/configs/chess_full.txt old mode 100644 new mode 100755 diff --git a/configs/chess_simple.txt b/configs/chess_simple.txt old mode 100644 new mode 100755 diff --git a/configs/cornell.txt b/configs/cornell.txt old mode 100644 new mode 100755 diff --git a/configs/drums.txt b/configs/drums.txt old mode 100644 new mode 100755 diff --git a/configs/fern.txt b/configs/fern.txt old mode 100644 new mode 100755 diff --git a/configs/ficus.txt b/configs/ficus.txt old mode 100644 new mode 100755 diff --git a/configs/flower.txt b/configs/flower.txt old mode 100644 new mode 100755 diff --git a/configs/fortress.txt b/configs/fortress.txt old mode 100644 new mode 100755 diff --git a/configs/horns.txt b/configs/horns.txt old mode 100644 new mode 100755 diff --git a/configs/hotdog.txt b/configs/hotdog.txt old mode 100644 new mode 100755 diff --git a/configs/leaves.txt b/configs/leaves.txt old mode 100644 new mode 100755 diff --git a/configs/lego.txt b/configs/lego.txt old mode 100644 new mode 100755 diff --git a/configs/materials.txt b/configs/materials.txt old mode 100644 new mode 100755 diff --git a/configs/mic.txt b/configs/mic.txt old mode 100644 new mode 100755 diff --git a/configs/orchids.txt b/configs/orchids.txt old mode 100644 new mode 100755 diff --git a/configs/room.txt b/configs/room.txt old mode 100644 new mode 100755 diff --git a/configs/scannet.txt b/configs/scannet.txt old mode 100644 new mode 100755 diff --git a/configs/ship.txt b/configs/ship.txt old mode 100644 new mode 100755 diff --git a/configs/trex.txt b/configs/trex.txt old mode 100644 new mode 100755 diff --git a/data/camera.npy b/data/camera.npy old mode 100644 new mode 100755 diff --git a/data/furniture/gt/0.mtl b/data/furniture/gt/0.mtl new file mode 100755 index 0000000..5858f9a --- /dev/null +++ b/data/furniture/gt/0.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd.blend' +# Material Count: 1 + +newmtl solid_001_wire.010 +Ns 1000.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.090196 0.062745 0.011765 +Ks 0.039216 0.039216 0.039216 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 0.mtl.png diff --git a/data/furniture/gt/0.mtl.png b/data/furniture/gt/0.mtl.png new file mode 100755 index 0000000..03edd58 Binary files /dev/null and b/data/furniture/gt/0.mtl.png differ diff --git a/data/furniture/gt/0_bg.png b/data/furniture/gt/0_bg.png new file mode 100755 index 0000000..9fa79de Binary files /dev/null and b/data/furniture/gt/0_bg.png differ diff --git a/data/furniture/gt/0_gt.png b/data/furniture/gt/0_gt.png new file mode 100755 index 0000000..9448720 Binary files /dev/null and b/data/furniture/gt/0_gt.png differ diff --git a/data/furniture/gt/1.mtl b/data/furniture/gt/1.mtl new file mode 100755 index 0000000..3c3d43b --- /dev/null +++ b/data/furniture/gt/1.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd.blend' +# Material Count: 1 + +newmtl solid_001_wire.013 +Ns 1000.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.607843 0.482353 0.047059 +Ks 0.282353 0.282353 0.282353 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 1.mtl.png diff --git a/data/furniture/gt/1.mtl.png b/data/furniture/gt/1.mtl.png new file mode 100755 index 0000000..ab91be8 Binary files /dev/null and b/data/furniture/gt/1.mtl.png differ diff --git a/data/furniture/gt/2.mtl b/data/furniture/gt/2.mtl new file mode 100755 index 0000000..21a6795 --- /dev/null +++ b/data/furniture/gt/2.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd.blend' +# Material Count: 1 + +newmtl solid_001_wire.016 +Ns 1000.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.500000 0.500000 0.500000 +Ks 1.000000 1.000000 1.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 2.mtl.png diff --git a/data/furniture/gt/2.mtl.png b/data/furniture/gt/2.mtl.png new file mode 100755 index 0000000..8293ea9 Binary files /dev/null and b/data/furniture/gt/2.mtl.png differ diff --git a/data/furniture/gt/3.mtl b/data/furniture/gt/3.mtl new file mode 100755 index 0000000..9213c02 --- /dev/null +++ b/data/furniture/gt/3.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd.blend' +# Material Count: 1 + +newmtl solid_001_wire.017 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.500000 0.500000 0.500000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 +map_Kd 3.mtl.png diff --git a/data/furniture/gt/3.mtl.png b/data/furniture/gt/3.mtl.png new file mode 100755 index 0000000..ec02197 Binary files /dev/null and b/data/furniture/gt/3.mtl.png differ diff --git a/data/furniture/gt/4.mtl b/data/furniture/gt/4.mtl new file mode 100755 index 0000000..416d639 --- /dev/null +++ b/data/furniture/gt/4.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd.blend' +# Material Count: 1 + +newmtl solid_001_wire.011 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.709804 0.709804 0.709804 +Ks 0.078431 0.078431 0.078431 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 4.mtl.png diff --git a/data/furniture/gt/4.mtl.png b/data/furniture/gt/4.mtl.png new file mode 100755 index 0000000..2a3c136 Binary files /dev/null and b/data/furniture/gt/4.mtl.png differ diff --git a/data/furniture/gt/camera.txt b/data/furniture/gt/camera.txt new file mode 100755 index 0000000..9973fcb --- /dev/null +++ b/data/furniture/gt/camera.txt @@ -0,0 +1,2 @@ +0.5960689783096313 0.6635787487030029 2.2868263721466064 +1.0122909545898438 4.003929632290237e-09 -1.5707963705062866 diff --git a/data/furniture/init/0.mtl b/data/furniture/init/0.mtl new file mode 100755 index 0000000..2f1fe6a --- /dev/null +++ b/data/furniture/init/0.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd-mod.blend' +# Material Count: 1 + +newmtl solid_001_wire.010 +Ns 1000.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.090196 0.062745 0.011765 +Ks 0.039216 0.039216 0.039216 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 0.mtl.png diff --git a/data/furniture/init/0.mtl.png b/data/furniture/init/0.mtl.png new file mode 100755 index 0000000..03edd58 Binary files /dev/null and b/data/furniture/init/0.mtl.png differ diff --git a/data/furniture/init/0_bg.png b/data/furniture/init/0_bg.png new file mode 100755 index 0000000..cf0a2bf Binary files /dev/null and b/data/furniture/init/0_bg.png differ diff --git a/data/furniture/init/0_gt.png b/data/furniture/init/0_gt.png new file mode 100755 index 0000000..848ba09 Binary files /dev/null and b/data/furniture/init/0_gt.png differ diff --git a/data/furniture/init/1.mtl b/data/furniture/init/1.mtl new file mode 100755 index 0000000..3a402c5 --- /dev/null +++ b/data/furniture/init/1.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd-mod.blend' +# Material Count: 1 + +newmtl solid_001_wire.013 +Ns 1000.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.607843 0.482353 0.047059 +Ks 0.282353 0.282353 0.282353 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 1.mtl.png diff --git a/data/furniture/init/1.mtl.png b/data/furniture/init/1.mtl.png new file mode 100755 index 0000000..ab91be8 Binary files /dev/null and b/data/furniture/init/1.mtl.png differ diff --git a/data/furniture/init/2.mtl b/data/furniture/init/2.mtl new file mode 100755 index 0000000..fe919ac --- /dev/null +++ b/data/furniture/init/2.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd-mod.blend' +# Material Count: 1 + +newmtl solid_001_wire.016 +Ns 1000.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.500000 0.500000 0.500000 +Ks 1.000000 1.000000 1.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 2.mtl.png diff --git a/data/furniture/init/2.mtl.png b/data/furniture/init/2.mtl.png new file mode 100755 index 0000000..8293ea9 Binary files /dev/null and b/data/furniture/init/2.mtl.png differ diff --git a/data/furniture/init/3.mtl b/data/furniture/init/3.mtl new file mode 100755 index 0000000..7983705 --- /dev/null +++ b/data/furniture/init/3.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd-mod.blend' +# Material Count: 1 + +newmtl solid_001_wire.017 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.500000 0.500000 0.500000 +Ks 0.000000 0.000000 0.000000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 1 +map_Kd 3.mtl.png diff --git a/data/furniture/init/3.mtl.png b/data/furniture/init/3.mtl.png new file mode 100755 index 0000000..ec02197 Binary files /dev/null and b/data/furniture/init/3.mtl.png differ diff --git a/data/furniture/init/4.mtl b/data/furniture/init/4.mtl new file mode 100755 index 0000000..edbb63f --- /dev/null +++ b/data/furniture/init/4.mtl @@ -0,0 +1,13 @@ +# Blender MTL File: 'd-mod.blend' +# Material Count: 1 + +newmtl solid_001_wire.011 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.709804 0.709804 0.709804 +Ks 0.078431 0.078431 0.078431 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd 4.mtl.png diff --git a/data/furniture/init/4.mtl.png b/data/furniture/init/4.mtl.png new file mode 100755 index 0000000..2a3c136 Binary files /dev/null and b/data/furniture/init/4.mtl.png differ diff --git a/data/furniture/init/camera.txt b/data/furniture/init/camera.txt new file mode 100755 index 0000000..c3ffad5 --- /dev/null +++ b/data/furniture/init/camera.txt @@ -0,0 +1,2 @@ +0.5960689783096313 0.6635787487030029 2.2868263721466064 +1.0122909545898438 -0.0 -1.5707963705062866 diff --git a/data/head/bump-lowRes.png b/data/head/bump-lowRes.png old mode 100644 new mode 100755 diff --git a/data/head/bump.png b/data/head/bump.png old mode 100644 new mode 100755 diff --git a/data/head/head.mtl b/data/head/head.mtl old mode 100644 new mode 100755 diff --git a/data/head/head.obj b/data/head/head.obj old mode 100644 new mode 100755 diff --git a/data/head/head.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a b/data/head/head.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a old mode 100644 new mode 100755 diff --git a/data/head/lambertian.jpg b/data/head/lambertian.jpg old mode 100644 new mode 100755 diff --git a/data/head/normal_high.jpg b/data/head/normal_high.jpg old mode 100644 new mode 100755 diff --git a/data/head2/Colour_8k.jpg b/data/head2/Colour_8k.jpg old mode 100644 new mode 100755 diff --git a/data/head2/Head.mtl b/data/head2/Head.mtl old mode 100644 new mode 100755 diff --git a/data/imgs/Real.png b/data/imgs/Real.png old mode 100644 new mode 100755 diff --git a/data/imgs/Speed.png b/data/imgs/Speed.png old mode 100644 new mode 100755 diff --git a/data/imgs/Synthesized.png b/data/imgs/Synthesized.png old mode 100644 new mode 100755 diff --git a/data/imgs/easyship-improved.png b/data/imgs/easyship-improved.png old mode 100644 new mode 100755 diff --git a/data/imgs/easyship-origin.png b/data/imgs/easyship-origin.png old mode 100644 new mode 100755 diff --git a/data/imgs/fern.gif b/data/imgs/fern.gif old mode 100644 new mode 100755 diff --git a/data/imgs/flower.gif b/data/imgs/flower.gif old mode 100644 new mode 100755 diff --git a/data/imgs/horn.gif b/data/imgs/horn.gif old mode 100644 new mode 100755 diff --git a/data/imgs/hotdog.gif b/data/imgs/hotdog.gif old mode 100644 new mode 100755 diff --git a/data/imgs/lego.gif b/data/imgs/lego.gif old mode 100644 new mode 100755 diff --git a/data/imgs/metallic.gif b/data/imgs/metallic.gif old mode 100644 new mode 100755 diff --git a/data/imgs/mic.gif b/data/imgs/mic.gif old mode 100644 new mode 100755 diff --git a/data/imgs/n3mr-deform.gif b/data/imgs/n3mr-deform.gif old mode 100644 new mode 100755 diff --git a/data/imgs/n3mr-rgb.gif b/data/imgs/n3mr-rgb.gif old mode 100644 new mode 100755 diff --git a/data/imgs/n3mr-silhouettes.gif b/data/imgs/n3mr-silhouettes.gif old mode 100644 new mode 100755 diff --git a/data/imgs/optim_textures.gif b/data/imgs/optim_textures.gif old mode 100644 new mode 100755 diff --git a/data/imgs/roughness.gif b/data/imgs/roughness.gif old mode 100644 new mode 100755 diff --git a/data/imgs/softras-rgb.gif b/data/imgs/softras-rgb.gif old mode 100644 new mode 100755 diff --git a/data/imgs/softras-silhouettes.gif b/data/imgs/softras-silhouettes.gif old mode 100644 new mode 100755 diff --git a/data/imgs/specular.gif b/data/imgs/specular.gif old mode 100644 new mode 100755 diff --git a/data/obj/plane/plane.obj b/data/obj/plane/plane.obj old mode 100644 new mode 100755 diff --git a/data/obj/plane/plane.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a b/data/obj/plane/plane.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a old mode 100644 new mode 100755 diff --git a/data/obj/sphere/OIP-C.jpg b/data/obj/sphere/OIP-C.jpg old mode 100644 new mode 100755 diff --git a/data/obj/sphere/sphere_1352.mtl b/data/obj/sphere/sphere_1352.mtl old mode 100644 new mode 100755 diff --git a/data/obj/sphere/sphere_1352.obj b/data/obj/sphere/sphere_1352.obj old mode 100644 new mode 100755 diff --git a/data/obj/sphere/sphere_1352.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a b/data/obj/sphere/sphere_1352.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a old mode 100644 new mode 100755 diff --git a/data/obj/sphere/sphere_642.obj b/data/obj/sphere/sphere_642.obj old mode 100644 new mode 100755 diff --git a/data/obj/sphere/sphere_642.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a b/data/obj/sphere/sphere_642.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a old mode 100644 new mode 100755 diff --git a/data/obj/spot/spot_texture.png b/data/obj/spot/spot_texture.png old mode 100644 new mode 100755 diff --git a/data/obj/spot/spot_triangulated.mtl b/data/obj/spot/spot_triangulated.mtl old mode 100644 new mode 100755 diff --git a/data/obj/spot/spot_triangulated.obj b/data/obj/spot/spot_triangulated.obj old mode 100644 new mode 100755 diff --git a/data/obj/spot/spot_triangulated.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a b/data/obj/spot/spot_triangulated.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a old mode 100644 new mode 100755 diff --git a/data/ref/init_metallic.png b/data/ref/init_metallic.png old mode 100644 new mode 100755 diff --git a/data/ref/init_roughness.png b/data/ref/init_roughness.png old mode 100644 new mode 100755 diff --git a/data/ref/ref_metallic.png b/data/ref/ref_metallic.png old mode 100644 new mode 100755 diff --git a/data/ref/ref_roughness.png b/data/ref/ref_roughness.png old mode 100644 new mode 100755 diff --git a/data/ref/ref_texture.png b/data/ref/ref_texture.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform.gif b/data/results/output_deform/deform.gif old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00000.png b/data/results/output_deform/deform_00000.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00100.png b/data/results/output_deform/deform_00100.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00200.png b/data/results/output_deform/deform_00200.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00300.png b/data/results/output_deform/deform_00300.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00400.png b/data/results/output_deform/deform_00400.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00500.png b/data/results/output_deform/deform_00500.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00600.png b/data/results/output_deform/deform_00600.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00700.png b/data/results/output_deform/deform_00700.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00800.png b/data/results/output_deform/deform_00800.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/deform_00900.png b/data/results/output_deform/deform_00900.png old mode 100644 new mode 100755 diff --git a/data/results/output_deform/plane.obj b/data/results/output_deform/plane.obj old mode 100644 new mode 100755 diff --git a/data/results/output_deform/plane.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a b/data/results/output_deform/plane.obj~5fbc0ef13b78afa7b9945513b1b5fd5e2980a95a old mode 100644 new mode 100755 diff --git a/data/results/output_drot_furniture/process.gif b/data/results/output_drot_furniture/process.gif new file mode 100644 index 0000000..21cfd22 Binary files /dev/null and b/data/results/output_drot_furniture/process.gif differ diff --git a/data/results/output_optim_metallic_textures/result.gif b/data/results/output_optim_metallic_textures/result.gif old mode 100644 new mode 100755 diff --git a/data/results/output_optim_roughness_textures/result.gif b/data/results/output_optim_roughness_textures/result.gif old mode 100644 new mode 100755 diff --git a/data/results/output_optim_textures/result.gif b/data/results/output_optim_textures/result.gif old mode 100644 new mode 100755 diff --git a/data/results/output_render/bluring.gif b/data/results/output_render/bluring.gif deleted file mode 100644 index 1f13136..0000000 Binary files a/data/results/output_render/bluring.gif and /dev/null differ diff --git a/data/results/output_render/buddha_with_ssao.jpg b/data/results/output_render/buddha_with_ssao.jpg deleted file mode 100644 index c8863a2..0000000 Binary files a/data/results/output_render/buddha_with_ssao.jpg and /dev/null differ diff --git a/data/results/output_render/buddha_without_ssao.jpg b/data/results/output_render/buddha_without_ssao.jpg deleted file mode 100644 index f4838ec..0000000 Binary files a/data/results/output_render/buddha_without_ssao.jpg and /dev/null differ diff --git a/data/results/output_render/bunny_with_ssr.jpg b/data/results/output_render/bunny_with_ssr.jpg deleted file mode 100644 index 14f6851..0000000 Binary files a/data/results/output_render/bunny_with_ssr.jpg and /dev/null differ diff --git a/data/results/output_render/bunny_with_sssr.jpg b/data/results/output_render/bunny_with_sssr.jpg deleted file mode 100644 index b0d3382..0000000 Binary files a/data/results/output_render/bunny_with_sssr.jpg and /dev/null differ diff --git a/data/results/output_render/cone_hard_shadow.jpg b/data/results/output_render/cone_hard_shadow.jpg deleted file mode 100644 index afb7d0f..0000000 Binary files a/data/results/output_render/cone_hard_shadow.jpg and /dev/null differ diff --git a/data/results/output_render/cone_soft_shadow.jpg b/data/results/output_render/cone_soft_shadow.jpg deleted file mode 100644 index 7adfe16..0000000 Binary files a/data/results/output_render/cone_soft_shadow.jpg and /dev/null differ diff --git a/data/results/output_render/cornellbox_with_ssr.jpg b/data/results/output_render/cornellbox_with_ssr.jpg deleted file mode 100644 index 2541711..0000000 Binary files a/data/results/output_render/cornellbox_with_ssr.jpg and /dev/null differ diff --git a/data/results/output_render/cornellbox_with_sssr.jpg b/data/results/output_render/cornellbox_with_sssr.jpg deleted file mode 100644 index b27d4f6..0000000 Binary files a/data/results/output_render/cornellbox_with_sssr.jpg and /dev/null differ diff --git a/data/results/output_render/desk_hard_shadow.jpg b/data/results/output_render/desk_hard_shadow.jpg deleted file mode 100644 index c1e921d..0000000 Binary files a/data/results/output_render/desk_hard_shadow.jpg and /dev/null differ diff --git a/data/results/output_render/desk_soft_shadow.jpg b/data/results/output_render/desk_soft_shadow.jpg deleted file mode 100644 index b25e664..0000000 Binary files a/data/results/output_render/desk_soft_shadow.jpg and /dev/null differ diff --git a/data/results/output_render/noSSS.jpg b/data/results/output_render/noSSS.jpg deleted file mode 100644 index 194c25c..0000000 Binary files a/data/results/output_render/noSSS.jpg and /dev/null differ diff --git a/data/results/output_render/noSSS2.jpg b/data/results/output_render/noSSS2.jpg deleted file mode 100644 index 07f41d2..0000000 Binary files a/data/results/output_render/noSSS2.jpg and /dev/null differ diff --git a/data/results/output_render/rotation.gif b/data/results/output_render/rotation.gif deleted file mode 100644 index 9978d65..0000000 Binary files a/data/results/output_render/rotation.gif and /dev/null differ diff --git a/data/results/output_render/saved_spot.obj b/data/results/output_render/saved_spot.obj deleted file mode 100644 index ee3f926..0000000 --- a/data/results/output_render/saved_spot.obj +++ /dev/null @@ -1,8790 +0,0 @@ -# saved_spot.obj -# - -v 0.34879899 -0.33498901 -0.08323310 -v 0.31313199 -0.39905101 0.88119203 -v 0.26675799 0.18162800 0.12272600 -v 0.22955500 0.06631780 0.82870197 -v 0.35362300 -0.04864560 0.44396901 -v 0.33587801 -0.38449499 0.42569301 -v 0.30536199 0.03079830 -0.00655663 -v 0.27961099 -0.05523870 0.85854697 -v 0.26671901 0.10578000 0.46680999 -v 0.14934100 -0.45152199 0.16642299 -v 0.12605999 -0.16203600 -0.18566801 -v 0.11400900 -0.35833901 -0.07595210 -v 0.10154600 -0.47538200 0.66315699 -v 0.24075700 -0.43563500 0.42198101 -v 0.38582501 -0.17450100 0.18076600 -v 0.35860199 -0.37797001 0.17896999 -v 0.34595299 -0.22970501 0.66412598 -v 0.31610200 -0.41939601 0.64915299 -v 0.13196100 -0.20138200 0.95173103 -v 0.08767660 -0.39118201 0.90160602 -v 0.16185901 0.28535599 0.30309799 -v 0.17726400 0.28283900 0.08755370 -v 0.15878600 0.07518890 -0.14134300 -v 0.31097400 -0.09740990 -0.06977620 -v 0.13823600 0.19114199 0.70039302 -v 0.13061000 0.10988100 0.87365699 -v 0.28754401 -0.21454901 0.86493802 -v 0.25444999 0.10133600 0.68011200 -v 0.34303999 -0.05411650 0.67228597 -v 0.36938801 -0.02427750 0.20583799 -v 0.27378201 0.16033199 0.27386099 -v 0.36906999 -0.22833200 0.43527901 -v 0.14607400 0.20606300 0.48805201 -v 0.15689000 0.31725299 -0.01795540 -v 0.18452901 0.18123500 -0.23857400 -v 0.22987700 0.44603801 -0.04280950 -v 0.32658401 0.30367601 -0.37549400 -v 0.25791499 0.48896900 -0.51772100 -v 0.18771100 0.73029500 -0.43713400 -v 0.19044200 0.12285600 -0.43769601 -v 0.27150100 0.20197900 -0.57985300 -v 0.22796100 0.33701599 -0.64146799 -v 0.32328799 -0.64589798 -0.06500690 -v 0.27755901 -0.66065902 0.87242597 -v 0.15321000 -0.67155302 0.11659700 -v 0.15334301 -0.65251201 -0.06284890 -v 0.12975200 -0.68041301 0.71423298 -v 0.31074399 -0.65815902 0.12474000 -v 0.27019700 -0.67020398 0.70542902 -v 0.12566499 -0.66437101 0.87701702 -v 0.26416901 0.64694601 -0.36989701 -v 0.18035901 0.68646002 -0.14827900 -v 0.26320401 0.56037498 -0.13719100 -v 0.37176499 0.68386900 -0.32119599 -v 0.43219501 0.75124598 -0.23345700 -v 0.42457399 0.68043900 -0.15085500 -v 0.37934601 0.60404903 -0.21307500 -v 0.00000000 -0.19208400 -0.19640701 -v 0.00000000 0.50567800 -0.56301600 -v 0.00000000 0.34064099 -0.66506600 -v 0.00000000 0.04147750 -0.24159101 -v 0.00000000 0.11761500 -0.30538401 -v 0.00000000 0.10038400 -0.45056400 -v 0.00000000 0.18258700 -0.61615503 -v -0.00000000 0.76506698 -0.44907200 -v -0.00000000 0.83475697 -0.30766800 -v 0.00000000 -0.43477401 0.06151920 -v 0.00000000 -0.35412601 -0.06770480 -v 0.00000000 0.32612401 0.13953800 -v 0.00000000 0.35220701 0.03886310 -v 0.00000000 0.49917501 0.05866130 -v -0.00000000 0.72390598 -0.05971070 -v 0.00000000 0.81606102 -0.18936899 -v 0.00000000 -0.43524900 0.72654802 -v 0.00000000 -0.53372401 0.41551101 -v 0.00000000 0.30119401 0.31271899 -v 0.00000000 0.23334201 0.49566001 -v 0.00000000 -0.34003699 0.89169103 -v 0.00000000 -0.19499500 0.97137898 -v 0.00000000 0.22055300 0.71102500 -v 0.00000000 0.13047799 0.89117098 -v 0.16401500 0.92933899 -0.23209400 -v 0.20590501 0.91574103 -0.31337401 -v 0.15338001 0.93555403 -0.28202900 -v 0.22178601 0.90546101 -0.25602099 -v 0.11523600 0.83789599 -0.22205400 -v 0.08632700 0.81220901 -0.21146500 -v 0.17223100 0.81931198 -0.33410400 -v 0.16246399 0.79107797 -0.35184601 -v 0.07873620 0.82210201 -0.29436600 -v 0.10299900 0.84473598 -0.28822899 -v 0.21939901 0.75455201 -0.28347999 -v 0.19975100 0.79038203 -0.24488100 -v 0.18468399 0.76200902 -0.19615200 -v 0.27970299 0.76243901 -0.23318601 -v 0.12031100 -0.45651701 0.24309400 -v 0.11128200 -0.47731599 0.58187997 -v 0.18616401 -0.48770100 0.41753301 -v 0.00000000 -0.46240401 0.20873900 -v 0.00000000 -0.48394799 0.60642099 -v 0.17185000 -0.04109770 0.94527000 -v 0.10624900 -0.01421670 0.96853298 -v 0.10739500 -0.06534630 0.97525299 -v 0.00000000 0.00228925 0.98717701 -v 0.00000000 -0.07561630 0.99550700 -v 0.05175090 -0.06083590 1.02472997 -v 0.05179510 -0.07980930 1.01119995 -v 0.00000000 -0.06882510 1.04806995 -v 0.00000000 -0.09521920 1.02642000 -v -0.34879899 -0.33498901 -0.08323310 -v -0.31313199 -0.39905101 0.88119203 -v -0.26675799 0.18162800 0.12272600 -v -0.22955500 0.06631780 0.82870197 -v -0.35362300 -0.04864560 0.44396901 -v -0.33587801 -0.38449499 0.42569301 -v -0.30536199 0.03079830 -0.00655663 -v -0.27961099 -0.05523870 0.85854697 -v -0.26671901 0.10578000 0.46680999 -v -0.14934100 -0.45152199 0.16642299 -v -0.12605999 -0.16203600 -0.18566801 -v -0.11400900 -0.35833901 -0.07595210 -v -0.10154600 -0.47538200 0.66315699 -v -0.24075700 -0.43563500 0.42198101 -v -0.38582501 -0.17450100 0.18076600 -v -0.35860199 -0.37797001 0.17896999 -v -0.34595299 -0.22970501 0.66412598 -v -0.31610200 -0.41939601 0.64915299 -v -0.13196100 -0.20138200 0.95173103 -v -0.08767660 -0.39118201 0.90160602 -v -0.16185901 0.28535599 0.30309799 -v -0.17726400 0.28283900 0.08755370 -v -0.15878600 0.07518890 -0.14134300 -v -0.31097400 -0.09740990 -0.06977620 -v -0.13823600 0.19114199 0.70039302 -v -0.13061000 0.10988100 0.87365699 -v -0.28754401 -0.21454901 0.86493802 -v -0.25444999 0.10133600 0.68011200 -v -0.34303999 -0.05411650 0.67228597 -v -0.36938801 -0.02427750 0.20583799 -v -0.27378201 0.16033199 0.27386099 -v -0.36906999 -0.22833200 0.43527901 -v -0.14607400 0.20606300 0.48805201 -v -0.15689000 0.31725299 -0.01795540 -v -0.18452901 0.18123500 -0.23857400 -v -0.22987700 0.44603801 -0.04280950 -v -0.32658401 0.30367601 -0.37549400 -v -0.25791499 0.48896900 -0.51772100 -v -0.18771100 0.73029500 -0.43713400 -v -0.19044200 0.12285600 -0.43769601 -v -0.27150100 0.20197900 -0.57985300 -v -0.22796100 0.33701599 -0.64146799 -v -0.32328799 -0.64589798 -0.06500690 -v -0.27755901 -0.66065902 0.87242597 -v -0.15321000 -0.67155302 0.11659700 -v -0.15334301 -0.65251201 -0.06284890 -v -0.12975200 -0.68041301 0.71423298 -v -0.31074399 -0.65815902 0.12474000 -v -0.27019700 -0.67020398 0.70542902 -v -0.12566499 -0.66437101 0.87701702 -v -0.26416901 0.64694601 -0.36989701 -v -0.18035901 0.68646002 -0.14827900 -v -0.26320401 0.56037498 -0.13719100 -v -0.37176499 0.68386900 -0.32119599 -v -0.43219501 0.75124598 -0.23345700 -v -0.42457399 0.68043900 -0.15085500 -v -0.37934601 0.60404903 -0.21307500 -v -0.16401500 0.92933899 -0.23209400 -v -0.20590501 0.91574103 -0.31337401 -v -0.15338001 0.93555403 -0.28202900 -v -0.22178601 0.90546101 -0.25602099 -v -0.11523600 0.83789599 -0.22205400 -v -0.08632700 0.81220901 -0.21146500 -v -0.17223100 0.81931198 -0.33410400 -v -0.16246399 0.79107797 -0.35184601 -v -0.07873620 0.82210201 -0.29436600 -v -0.10299900 0.84473598 -0.28822899 -v -0.21939901 0.75455201 -0.28347999 -v -0.19975100 0.79038203 -0.24488100 -v -0.18468399 0.76200902 -0.19615200 -v -0.27970299 0.76243901 -0.23318601 -v -0.12031100 -0.45651701 0.24309400 -v -0.11128200 -0.47731599 0.58187997 -v -0.18616401 -0.48770100 0.41753301 -v -0.17185000 -0.04109770 0.94527000 -v -0.10624900 -0.01421670 0.96853298 -v -0.10739500 -0.06534630 0.97525299 -v -0.05175090 -0.06083590 1.02472997 -v -0.05179510 -0.07980930 1.01119995 -v 0.28706300 -0.41791201 0.42339000 -v 0.22332300 -0.43174899 0.30083901 -v 0.26259899 -0.44657400 0.21416500 -v 0.34568301 -0.36745799 0.30562201 -v 0.28486201 -0.41023901 0.30485699 -v 0.32046700 -0.39045399 0.53852701 -v 0.21864900 -0.47485301 0.61994499 -v 0.19621000 -0.44728500 0.53873199 -v 0.25702500 -0.42906401 0.53659099 -v 0.24060200 -0.34121400 -0.11745200 -v 0.12147000 -0.24927400 -0.14502200 -v 0.22115700 -0.12039300 -0.14605799 -v 0.32871500 -0.19276100 -0.07781930 -v 0.22947800 -0.21201099 -0.13314700 -v 0.30798700 -0.03311950 -0.04969100 -v 0.13989300 -0.05481820 -0.18110301 -v 0.23707500 0.05219490 -0.07597250 -v 0.22717300 -0.03723560 -0.12841301 -v 0.30149201 -0.29288501 0.87067401 -v 0.21327899 -0.20474200 0.92251801 -v 0.11749900 -0.28164199 0.93573898 -v 0.21181600 -0.39473200 0.92240900 -v 0.21554700 -0.28641501 0.91967398 -v 0.36496800 -0.12541001 0.04623500 -v 0.38245800 -0.25968000 0.17619701 -v 0.38519400 -0.35120499 0.03061590 -v 0.37541801 -0.21631300 0.03595910 -v 0.38257501 -0.20976400 0.31165299 -v 0.36114699 -0.31662399 0.43033800 -v 0.37438399 -0.29453200 0.30824801 -v 0.36866799 -0.13713400 0.43872899 -v 0.38513201 -0.10118500 0.18816800 -v 0.36514601 -0.04063680 0.32482901 -v 0.38194901 -0.12558401 0.31541201 -v 0.35023201 0.00253885 0.09082210 -v 0.36145800 -0.06195960 0.06091530 -v 0.34333101 -0.40917099 0.77857703 -v 0.34186199 -0.31390700 0.65794897 -v 0.32801899 -0.22331800 0.77374703 -v 0.33654401 -0.30310699 0.77533901 -v 0.28305200 -0.13263100 0.86357099 -v 0.35100099 -0.14243799 0.66882801 -v 0.32248700 -0.05650490 0.77401900 -v 0.32900000 -0.14048900 0.77430803 -v 0.34930101 -0.05213010 0.56090403 -v 0.35757199 -0.23312201 0.55166399 -v 0.36064699 -0.14181399 0.55656397 -v 0.34927201 -0.31987900 0.54457903 -v 0.23281001 0.22954300 0.11021700 -v 0.17018400 0.29982901 0.20555000 -v 0.22134100 0.23648100 0.29341799 -v 0.27268201 0.18135200 0.18958899 -v 0.22722600 0.25285900 0.20400800 -v 0.27115500 0.12952700 0.36622301 -v 0.15327600 0.24421600 0.39383999 -v 0.20969000 0.16457400 0.47865799 -v 0.21537501 0.19811299 0.38295400 -v 0.24281999 0.08759550 0.77072501 -v 0.19852100 0.15468200 0.68970901 -v 0.13453300 0.16168199 0.79657799 -v 0.18726200 0.08688700 0.85488701 -v 0.19155800 0.13202600 0.78245002 -v 0.14154500 0.19658200 0.59350902 -v 0.26179001 0.10167400 0.57476902 -v 0.20439200 0.15725701 0.58439398 -v 0.32775500 0.06762720 0.23951600 -v 0.31732100 0.03351170 0.45417300 -v 0.32472599 0.04692620 0.34419200 -v 0.30707201 0.02960920 0.67507899 -v 0.25394100 0.01574080 0.84816802 -v 0.28986299 0.02252210 0.77107000 -v 0.19090100 0.18801600 -0.03004820 -v 0.28817400 0.11677100 0.06391970 -v 0.23929900 0.15156400 0.01183420 -v 0.31346700 0.03056600 0.56685102 -v 0.31703299 0.09097830 0.14297301 -v 0.15001801 0.14806600 -0.17035501 -v 0.19200300 0.25762701 -0.11400700 -v 0.15092300 0.29068601 0.01626510 -v 0.17261900 0.22124501 -0.07221040 -v 0.27403101 0.23830999 -0.30131799 -v 0.29487601 0.38350299 -0.20377301 -v 0.19406800 0.37243000 -0.02690370 -v 0.24862900 0.31109801 -0.15386200 -v 0.19680600 0.14127401 -0.36292401 -v 0.23910999 0.14497000 -0.50289202 -v 0.32470101 0.24108000 -0.50272697 -v 0.27814701 0.18102400 -0.42350799 -v 0.26378599 0.27805001 -0.63021702 -v 0.25097901 0.38866201 -0.60130203 -v 0.31819800 0.39055800 -0.44652799 -v 0.31459299 0.32071000 -0.56329203 -v 0.33804601 -0.68009502 0.03094630 -v 0.22816500 -0.69242197 0.14740700 -v 0.12828000 -0.68970799 0.02457460 -v 0.23816100 -0.67738199 -0.09188560 -v 0.22968100 -0.73384202 0.02668990 -v 0.20056000 -0.68739301 0.89886302 -v 0.10791900 -0.69688398 0.79699498 -v 0.19917600 -0.69968599 0.68654001 -v 0.29181799 -0.69019502 0.78840798 -v 0.19824401 -0.73678398 0.79344797 -v 0.30785501 -0.55258000 0.89061999 -v 0.29459199 -0.57158101 0.67875302 -v 0.33556300 -0.56197101 0.78430998 -v 0.05936160 -0.45807600 0.79593199 -v 0.11092700 -0.59514201 0.69159901 -v 0.10273300 -0.55862498 0.89627397 -v 0.07167690 -0.58302802 0.79644698 -v 0.20300700 -0.59156901 0.64712697 -v 0.20666599 -0.55363601 0.93080401 -v 0.33912101 -0.54651600 0.15083200 -v 0.35293299 -0.52055699 -0.08851220 -v 0.38324401 -0.53233200 0.02971090 -v 0.13256900 -0.53465199 -0.07673160 -v 0.24402000 -0.52466202 -0.12428500 -v 0.14349900 -0.57751203 0.14191400 -v 0.24107300 -0.57178903 0.18852700 -v 0.09649420 -0.43490401 0.03429150 -v 0.09999510 -0.56397003 0.03175750 -v 0.27157599 0.56164700 -0.41631800 -v 0.28289399 0.56989002 -0.25728300 -v 0.23851000 0.52038699 -0.09078860 -v 0.29319501 0.48208401 -0.27665401 -v 0.21304500 0.60917699 -0.10998900 -v 0.32137600 0.57672399 -0.18568300 -v 0.42287800 0.63207299 -0.16866100 -v 0.32688001 0.68078399 -0.14520700 -v 0.32634500 0.61234099 -0.14154600 -v 0.31259400 0.67430902 -0.34118500 -v 0.37905300 0.63586998 -0.28389499 -v 0.31540000 0.60687101 -0.27841800 -v 0.41777301 0.73126602 -0.28891400 -v 0.46028700 0.72723597 -0.17736700 -v 0.45418501 0.68435103 -0.23046100 -v 0.00000000 0.32005101 0.22329800 -v 0.08576860 0.30118400 0.30987200 -v 0.09224740 0.32020301 0.12790599 -v 0.09103850 0.31825101 0.21666400 -v 0.00000000 0.22703300 0.60208601 -v 0.07106860 0.21311501 0.70809901 -v 0.07505960 0.22755000 0.49376601 -v 0.07247730 0.21958800 0.59977299 -v 0.00000000 0.18660299 0.81065100 -v 0.06704560 0.12515600 0.88625503 -v 0.06950620 0.18012001 0.80677497 -v 0.00000000 -0.40432000 -0.00187701 -v 0.05026850 -0.34467000 -0.06653970 -v 0.06617530 -0.43291900 0.08797890 -v 0.05636300 -0.39991200 0.01269680 -v 0.00000000 -0.39554599 0.81000900 -v 0.03985880 -0.44271100 0.71435702 -v 0.03611170 -0.34665000 0.89162397 -v 0.03211010 -0.40472600 0.80476499 -v 0.00000000 0.26469201 0.40128401 -v 0.07987270 0.26238400 0.39961800 -v 0.00000000 0.33032501 0.07165570 -v 0.08747520 0.34590101 0.02844990 -v 0.08584160 0.32348999 0.06055970 -v 0.00000000 0.40938401 0.05159770 -v 0.12429600 0.48754799 0.03405130 -v 0.10599700 0.40271500 0.03608840 -v 0.00000000 0.64157897 -0.50732499 -v 0.10473300 0.75508797 -0.44483101 -v 0.21428600 0.62938303 -0.48475400 -v 0.13639200 0.50382000 -0.55697399 -v 0.12181700 0.63684601 -0.50206101 -v 0.00000000 0.41294301 -0.62384200 -v 0.13927799 0.34090900 -0.66154897 -v 0.13894500 0.41147599 -0.62015301 -v 0.00000000 -0.27113700 0.94367599 -v 0.06221990 -0.19739300 0.96678901 -v 0.05012770 -0.27401400 0.94191498 -v 0.00000000 -0.28607300 -0.13852300 -v 0.05532980 -0.18580100 -0.19702201 -v 0.05020200 -0.27540499 -0.14232300 -v 0.00000000 -0.06954040 -0.22537801 -v 0.07666620 0.04579190 -0.21755099 -v 0.06550560 -0.06700690 -0.21449301 -v 0.00000000 0.10151900 -0.26491800 -v 0.09339590 0.13030900 -0.28522900 -v 0.08384630 0.11062000 -0.23888300 -v 0.00000000 0.10687400 -0.36930099 -v 0.11460300 0.10463700 -0.44550100 -v 0.10259600 0.11519900 -0.35983399 -v 0.00000000 0.12644100 -0.53936899 -v 0.15366501 0.18548900 -0.61119097 -v 0.13748400 0.12900200 -0.53409100 -v 0.00000000 0.25982499 -0.66134799 -v 0.15037100 0.26245299 -0.65735501 -v 0.08196360 0.70701098 -0.09788480 -v 0.00000000 0.61313701 0.01183720 -v 0.12893400 0.59354901 -0.02760650 -v 0.23089901 0.69619298 -0.41549599 -v 0.24620000 0.63205802 -0.45199800 -v 0.22550000 0.91841203 -0.28790900 -v 0.18228900 0.93735898 -0.30433401 -v 0.15583099 0.94591999 -0.25301600 -v 0.19904201 0.92697197 -0.23659100 -v 0.19838101 0.95085299 -0.26973000 -v 0.19553600 0.76870799 -0.32373199 -v 0.16259100 0.79664099 -0.33770600 -v 0.19813500 0.80441201 -0.30018401 -v 0.20485599 0.76783198 -0.25862700 -v 0.19034401 0.78041899 -0.30532101 -v 0.15859500 0.81701398 -0.22018600 -v 0.10283800 0.81530398 -0.21902999 -v 0.12548000 0.78628099 -0.19053100 -v 0.18859001 0.77147597 -0.21513100 -v 0.14521000 0.79341501 -0.20871200 -v 0.11381400 0.81072497 -0.33925501 -v 0.09115060 0.82227600 -0.28966001 -v 0.13434599 0.83413500 -0.32432801 -v 0.12321000 0.81186402 -0.32710499 -v 0.06994640 0.82375699 -0.24850200 -v 0.09563490 0.84684098 -0.24887700 -v 0.08366980 0.82454503 -0.24920399 -v 0.24364001 0.75784802 -0.20743300 -v 0.24644300 0.75695300 -0.25745299 -v 0.21289000 0.76224500 -0.22882999 -v 0.35575101 0.76242799 -0.23849700 -v 0.24996600 0.72350299 -0.33225900 -v 0.32003000 0.73964202 -0.30471399 -v 0.18184800 0.74131501 -0.18004300 -v 0.32851601 0.74197698 -0.18117499 -v 0.04996810 0.81217599 -0.19939500 -v 0.00000000 0.78570902 -0.12911600 -v 0.07883540 0.77428401 -0.15818900 -v 0.05056910 0.82885301 -0.30436799 -v 0.16802201 0.77875501 -0.38606501 -v 0.00000000 0.82111400 -0.37870699 -v 0.08971950 0.81179601 -0.37358701 -v 0.00000000 0.83180302 -0.24630301 -v 0.04047450 0.82835299 -0.24745899 -v 0.21130200 0.74437100 -0.36519599 -v 0.19370200 0.87269002 -0.32939199 -v 0.21655300 0.85666102 -0.25113600 -v 0.21855099 0.86075503 -0.29710200 -v 0.12684099 0.89738798 -0.28583601 -v 0.15751299 0.88798600 -0.32035801 -v 0.13893799 0.89058298 -0.22291200 -v 0.12016100 0.90019399 -0.24780101 -v 0.18113700 0.87294799 -0.22415400 -v 0.10629900 -0.46734801 0.61279398 -v 0.15675101 -0.48565099 0.51766199 -v 0.21886501 -0.45856801 0.41981599 -v 0.17771301 -0.46446100 0.52787101 -v 0.00000000 -0.45974201 0.66660500 -v 0.06407560 -0.48122501 0.60014999 -v 0.04868080 -0.46253300 0.65544897 -v 0.12976900 -0.44589099 0.21099199 -v 0.06749190 -0.45918399 0.21858200 -v 0.00000000 -0.44595599 0.12884000 -v 0.06383570 -0.44461799 0.15006000 -v 0.16016801 -0.47175801 0.31390899 -v 0.19293800 -0.45045000 0.30762401 -v 0.00000000 -0.51847702 0.51985198 -v 0.10697100 -0.51855302 0.41603199 -v 0.09137550 -0.50759399 0.51813197 -v 0.00000000 -0.50350899 0.30756301 -v 0.09068620 -0.49298599 0.31040701 -v 0.14893800 -0.01881780 0.95082700 -v 0.10974400 -0.04127630 0.97634101 -v 0.15229499 -0.05986950 0.95788097 -v 0.13313100 -0.03747620 0.96509099 -v 0.12914400 -0.12318600 0.96197599 -v 0.21492200 -0.04727680 0.91785300 -v 0.20294601 -0.11332100 0.93064499 -v 0.12477700 0.04482340 0.92676699 -v 0.18943100 0.01765020 0.90771699 -v 0.05412940 -0.00058215 0.98095697 -v 0.00000000 0.06367290 0.94613701 -v 0.06275210 0.05921340 0.94039702 -v 0.05447340 -0.07587180 0.98921901 -v 0.00000000 -0.12113400 0.98553997 -v 0.06315280 -0.12309400 0.97946799 -v 0.07163070 -0.04320000 1.00540996 -v 0.05279500 -0.07259240 1.01944995 -v 0.07176810 -0.06901060 0.99489403 -v 0.08092970 -0.05585010 0.99726301 -v 0.00000000 -0.04001180 1.02513003 -v 0.02972190 -0.06530480 1.04059005 -v 0.04069580 -0.03952240 1.01839006 -v 0.02975870 -0.09082370 1.02000999 -v 0.00000000 -0.07829120 1.00910997 -v 0.04078120 -0.07655670 1.00299001 -v 0.00000000 -0.09035610 1.04430997 -v 0.02640680 -0.08518060 1.03685999 -v -0.34568301 -0.36745799 0.30562201 -v -0.26259899 -0.44657400 0.21416500 -v -0.22332300 -0.43174899 0.30083901 -v -0.28706300 -0.41791201 0.42339000 -v -0.28486201 -0.41023901 0.30485699 -v -0.19621000 -0.44728500 0.53873199 -v -0.21864900 -0.47485301 0.61994499 -v -0.32046700 -0.39045399 0.53852701 -v -0.25702500 -0.42906401 0.53659099 -v -0.32871500 -0.19276100 -0.07781930 -v -0.22115700 -0.12039300 -0.14605799 -v -0.12147000 -0.24927400 -0.14502200 -v -0.24060200 -0.34121400 -0.11745200 -v -0.22947800 -0.21201099 -0.13314700 -v -0.23707500 0.05219490 -0.07597250 -v -0.13989300 -0.05481820 -0.18110301 -v -0.30798700 -0.03311950 -0.04969100 -v -0.22717300 -0.03723560 -0.12841301 -v -0.21181600 -0.39473200 0.92240900 -v -0.11749900 -0.28164199 0.93573898 -v -0.21327899 -0.20474200 0.92251801 -v -0.30149201 -0.29288501 0.87067401 -v -0.21554700 -0.28641501 0.91967398 -v -0.38519400 -0.35120499 0.03061590 -v -0.38245800 -0.25968000 0.17619701 -v -0.36496800 -0.12541001 0.04623500 -v -0.37541801 -0.21631300 0.03595910 -v -0.36114699 -0.31662399 0.43033800 -v -0.38257501 -0.20976400 0.31165299 -v -0.37438399 -0.29453200 0.30824801 -v -0.36514601 -0.04063680 0.32482901 -v -0.38513201 -0.10118500 0.18816800 -v -0.36866799 -0.13713400 0.43872899 -v -0.38194901 -0.12558401 0.31541201 -v -0.35023201 0.00253885 0.09082210 -v -0.36145800 -0.06195960 0.06091530 -v -0.32801899 -0.22331800 0.77374703 -v -0.34186199 -0.31390700 0.65794897 -v -0.34333101 -0.40917099 0.77857703 -v -0.33654401 -0.30310699 0.77533901 -v -0.32248700 -0.05650490 0.77401900 -v -0.35100099 -0.14243799 0.66882801 -v -0.28305200 -0.13263100 0.86357099 -v -0.32900000 -0.14048900 0.77430803 -v -0.35757199 -0.23312201 0.55166399 -v -0.34930101 -0.05213010 0.56090403 -v -0.36064699 -0.14181399 0.55656397 -v -0.34927201 -0.31987900 0.54457903 -v -0.27268201 0.18135200 0.18958899 -v -0.22134100 0.23648100 0.29341799 -v -0.17018400 0.29982901 0.20555000 -v -0.23281001 0.22954300 0.11021700 -v -0.22722600 0.25285900 0.20400800 -v -0.20969000 0.16457400 0.47865799 -v -0.15327600 0.24421600 0.39383999 -v -0.27115500 0.12952700 0.36622301 -v -0.21537501 0.19811299 0.38295400 -v -0.18726200 0.08688700 0.85488701 -v -0.13453300 0.16168199 0.79657799 -v -0.19852100 0.15468200 0.68970901 -v -0.24281999 0.08759550 0.77072501 -v -0.19155800 0.13202600 0.78245002 -v -0.26179001 0.10167400 0.57476902 -v -0.14154500 0.19658200 0.59350902 -v -0.20439200 0.15725701 0.58439398 -v -0.31732100 0.03351170 0.45417300 -v -0.32775500 0.06762720 0.23951600 -v -0.32472599 0.04692620 0.34419200 -v -0.25394100 0.01574080 0.84816802 -v -0.30707201 0.02960920 0.67507899 -v -0.28986299 0.02252210 0.77107000 -v -0.28817400 0.11677100 0.06391970 -v -0.19090100 0.18801600 -0.03004820 -v -0.23929900 0.15156400 0.01183420 -v -0.31346700 0.03056600 0.56685102 -v -0.31703299 0.09097830 0.14297301 -v -0.15092300 0.29068601 0.01626510 -v -0.19200300 0.25762701 -0.11400700 -v -0.15001801 0.14806600 -0.17035501 -v -0.17261900 0.22124501 -0.07221040 -v -0.19406800 0.37243000 -0.02690370 -v -0.29487601 0.38350299 -0.20377301 -v -0.27403101 0.23830999 -0.30131799 -v -0.24862900 0.31109801 -0.15386200 -v -0.32470101 0.24108000 -0.50272697 -v -0.23910999 0.14497000 -0.50289202 -v -0.19680600 0.14127401 -0.36292401 -v -0.27814701 0.18102400 -0.42350799 -v -0.31819800 0.39055800 -0.44652799 -v -0.25097901 0.38866201 -0.60130203 -v -0.26378599 0.27805001 -0.63021702 -v -0.31459299 0.32071000 -0.56329203 -v -0.23816100 -0.67738199 -0.09188560 -v -0.12828000 -0.68970799 0.02457460 -v -0.22816500 -0.69242197 0.14740700 -v -0.33804601 -0.68009502 0.03094630 -v -0.22968100 -0.73384202 0.02668990 -v -0.29181799 -0.69019502 0.78840798 -v -0.19917600 -0.69968599 0.68654001 -v -0.10791900 -0.69688398 0.79699498 -v -0.20056000 -0.68739301 0.89886302 -v -0.19824401 -0.73678398 0.79344797 -v -0.29459199 -0.57158101 0.67875302 -v -0.30785501 -0.55258000 0.89061999 -v -0.33556300 -0.56197101 0.78430998 -v -0.10273300 -0.55862498 0.89627397 -v -0.11092700 -0.59514201 0.69159901 -v -0.05936160 -0.45807600 0.79593199 -v -0.07167690 -0.58302802 0.79644698 -v -0.20300700 -0.59156901 0.64712697 -v -0.20666599 -0.55363601 0.93080401 -v -0.35293299 -0.52055699 -0.08851220 -v -0.33912101 -0.54651600 0.15083200 -v -0.38324401 -0.53233200 0.02971090 -v -0.13256900 -0.53465199 -0.07673160 -v -0.24402000 -0.52466202 -0.12428500 -v -0.14349900 -0.57751203 0.14191400 -v -0.24107300 -0.57178903 0.18852700 -v -0.09649420 -0.43490401 0.03429150 -v -0.09999510 -0.56397003 0.03175750 -v -0.23851000 0.52038699 -0.09078860 -v -0.28289399 0.56989002 -0.25728300 -v -0.27157599 0.56164700 -0.41631800 -v -0.29319501 0.48208401 -0.27665401 -v -0.32688001 0.68078399 -0.14520700 -v -0.42287800 0.63207299 -0.16866100 -v -0.32137600 0.57672399 -0.18568300 -v -0.21304500 0.60917699 -0.10998900 -v -0.32634500 0.61234099 -0.14154600 -v -0.37905300 0.63586998 -0.28389499 -v -0.31259400 0.67430902 -0.34118500 -v -0.31540000 0.60687101 -0.27841800 -v -0.46028700 0.72723597 -0.17736700 -v -0.41777301 0.73126602 -0.28891400 -v -0.45418501 0.68435103 -0.23046100 -v -0.09224740 0.32020301 0.12790599 -v -0.08576860 0.30118400 0.30987200 -v -0.09103850 0.31825101 0.21666400 -v -0.07505960 0.22755000 0.49376601 -v -0.07106860 0.21311501 0.70809901 -v -0.07247730 0.21958800 0.59977299 -v -0.06704560 0.12515600 0.88625503 -v -0.06950620 0.18012001 0.80677497 -v -0.06617530 -0.43291900 0.08797890 -v -0.05026850 -0.34467000 -0.06653970 -v -0.05636300 -0.39991200 0.01269680 -v -0.03611170 -0.34665000 0.89162397 -v -0.03985880 -0.44271100 0.71435702 -v -0.03211010 -0.40472600 0.80476499 -v -0.07987270 0.26238400 0.39961800 -v -0.08747520 0.34590101 0.02844990 -v -0.08584160 0.32348999 0.06055970 -v -0.12429600 0.48754799 0.03405130 -v -0.10599700 0.40271500 0.03608840 -v -0.13639200 0.50382000 -0.55697399 -v -0.21428600 0.62938303 -0.48475400 -v -0.10473300 0.75508797 -0.44483101 -v -0.12181700 0.63684601 -0.50206101 -v -0.13927799 0.34090900 -0.66154897 -v -0.13894500 0.41147599 -0.62015301 -v -0.06221990 -0.19739300 0.96678901 -v -0.05012770 -0.27401400 0.94191498 -v -0.05532980 -0.18580100 -0.19702201 -v -0.05020200 -0.27540499 -0.14232300 -v -0.07666620 0.04579190 -0.21755099 -v -0.06550560 -0.06700690 -0.21449301 -v -0.09339590 0.13030900 -0.28522900 -v -0.08384630 0.11062000 -0.23888300 -v -0.11460300 0.10463700 -0.44550100 -v -0.10259600 0.11519900 -0.35983399 -v -0.15366501 0.18548900 -0.61119097 -v -0.13748400 0.12900200 -0.53409100 -v -0.15037100 0.26245299 -0.65735501 -v -0.08196360 0.70701098 -0.09788480 -v -0.12893400 0.59354901 -0.02760650 -v -0.23089901 0.69619298 -0.41549599 -v -0.24620000 0.63205802 -0.45199800 -v -0.19904201 0.92697197 -0.23659100 -v -0.15583099 0.94591999 -0.25301600 -v -0.18228900 0.93735898 -0.30433401 -v -0.22550000 0.91841203 -0.28790900 -v -0.19838101 0.95085299 -0.26973000 -v -0.20485599 0.76783198 -0.25862700 -v -0.19813500 0.80441201 -0.30018401 -v -0.16259100 0.79664099 -0.33770600 -v -0.19553600 0.76870799 -0.32373199 -v -0.19034401 0.78041899 -0.30532101 -v -0.18859001 0.77147597 -0.21513100 -v -0.12548000 0.78628099 -0.19053100 -v -0.10283800 0.81530398 -0.21902999 -v -0.15859500 0.81701398 -0.22018600 -v -0.14521000 0.79341501 -0.20871200 -v -0.13434599 0.83413500 -0.32432801 -v -0.09115060 0.82227600 -0.28966001 -v -0.11381400 0.81072497 -0.33925501 -v -0.12321000 0.81186402 -0.32710499 -v -0.09563490 0.84684098 -0.24887700 -v -0.06994640 0.82375699 -0.24850200 -v -0.08366980 0.82454503 -0.24920399 -v -0.24644300 0.75695300 -0.25745299 -v -0.24364001 0.75784802 -0.20743300 -v -0.21289000 0.76224500 -0.22882999 -v -0.24996600 0.72350299 -0.33225900 -v -0.35575101 0.76242799 -0.23849700 -v -0.32003000 0.73964202 -0.30471399 -v -0.18184800 0.74131501 -0.18004300 -v -0.32851601 0.74197698 -0.18117499 -v -0.04996810 0.81217599 -0.19939500 -v -0.07883540 0.77428401 -0.15818900 -v -0.16802201 0.77875501 -0.38606501 -v -0.05056910 0.82885301 -0.30436799 -v -0.08971950 0.81179601 -0.37358701 -v -0.04047450 0.82835299 -0.24745899 -v -0.21130200 0.74437100 -0.36519599 -v -0.21655300 0.85666102 -0.25113600 -v -0.19370200 0.87269002 -0.32939199 -v -0.21855099 0.86075503 -0.29710200 -v -0.12684099 0.89738798 -0.28583601 -v -0.15751299 0.88798600 -0.32035801 -v -0.13893799 0.89058298 -0.22291200 -v -0.12016100 0.90019399 -0.24780101 -v -0.18113700 0.87294799 -0.22415400 -v -0.21886501 -0.45856801 0.41981599 -v -0.15675101 -0.48565099 0.51766199 -v -0.10629900 -0.46734801 0.61279398 -v -0.17771301 -0.46446100 0.52787101 -v -0.06407560 -0.48122501 0.60014999 -v -0.04868080 -0.46253300 0.65544897 -v -0.06749190 -0.45918399 0.21858200 -v -0.12976900 -0.44589099 0.21099199 -v -0.06383570 -0.44461799 0.15006000 -v -0.16016801 -0.47175801 0.31390899 -v -0.19293800 -0.45045000 0.30762401 -v -0.10697100 -0.51855302 0.41603199 -v -0.09137550 -0.50759399 0.51813197 -v -0.09068620 -0.49298599 0.31040701 -v -0.15229499 -0.05986950 0.95788097 -v -0.10974400 -0.04127630 0.97634101 -v -0.14893800 -0.01881780 0.95082700 -v -0.13313100 -0.03747620 0.96509099 -v -0.21492200 -0.04727680 0.91785300 -v -0.12914400 -0.12318600 0.96197599 -v -0.20294601 -0.11332100 0.93064499 -v -0.12477700 0.04482340 0.92676699 -v -0.18943100 0.01765020 0.90771699 -v -0.05412940 -0.00058215 0.98095697 -v -0.06275210 0.05921340 0.94039702 -v -0.05447340 -0.07587180 0.98921901 -v -0.06315280 -0.12309400 0.97946799 -v -0.07176810 -0.06901060 0.99489403 -v -0.05279500 -0.07259240 1.01944995 -v -0.07163070 -0.04320000 1.00540996 -v -0.08092970 -0.05585010 0.99726301 -v -0.02972190 -0.06530480 1.04059005 -v -0.04069580 -0.03952240 1.01839006 -v -0.02975870 -0.09082370 1.02000999 -v -0.04078120 -0.07655670 1.00299001 -v -0.02640680 -0.08518060 1.03685999 -v 0.31312099 -0.40468001 0.42430300 -v 0.28963801 -0.41198400 0.36304399 -v 0.31781799 -0.39242300 0.30548501 -v 0.34129900 -0.37594399 0.36623201 -v 0.31728801 -0.39729500 0.36444801 -v 0.23935001 -0.43199000 0.36184201 -v 0.25154400 -0.42243499 0.30233201 -v 0.26163200 -0.42722100 0.42270100 -v 0.26233199 -0.42266399 0.36213699 -v 0.20990001 -0.45762199 0.20231800 -v 0.27484599 -0.41875401 0.25265801 -v 0.19481701 -0.43740201 0.23935799 -v 0.23121101 -0.43096599 0.24548601 -v 0.35028401 -0.36445299 0.24478300 -v 0.31249499 -0.42258000 0.20841500 -v 0.31660101 -0.39641601 0.25019899 -v 0.32816201 -0.38769600 0.48308301 -v 0.29136199 -0.41337901 0.53681499 -v 0.27502501 -0.42194900 0.48206699 -v 0.30342600 -0.40822199 0.48226500 -v 0.26978999 -0.45549300 0.62400299 -v 0.23656400 -0.44422799 0.58447599 -v 0.31511101 -0.39767900 0.59214598 -v 0.28008899 -0.42560801 0.58643502 -v 0.15611900 -0.45852599 0.59578902 -v 0.22298899 -0.43942100 0.53834999 -v 0.16401100 -0.48303300 0.63140601 -v 0.19114301 -0.45386100 0.59111798 -v 0.22539900 -0.44019300 0.48087099 -v 0.24750200 -0.43167400 0.48182499 -v 0.30087301 -0.33580801 -0.11045000 -v 0.23546000 -0.26979399 -0.12322000 -v 0.28353500 -0.19808300 -0.11242000 -v 0.33951899 -0.25718200 -0.08028310 -v 0.29291499 -0.26019499 -0.11030800 -v 0.11947800 -0.29577601 -0.11387200 -v 0.17310600 -0.23047800 -0.14262800 -v 0.17638300 -0.34915000 -0.10631000 -v 0.17453200 -0.28287700 -0.12153100 -v 0.17201400 -0.14155100 -0.17000200 -v 0.22404701 -0.16349500 -0.14201500 -v 0.12311300 -0.20638800 -0.17004500 -v 0.17162099 -0.18499900 -0.16003700 -v 0.31849700 -0.14005899 -0.07469810 -v 0.26898000 -0.10390100 -0.11294500 -v 0.27485099 -0.14685600 -0.11417100 -v 0.30780801 -0.00318692 -0.03170950 -v 0.26987800 -0.03188810 -0.09288380 -v 0.23246200 0.00608204 -0.10682100 -v 0.27328101 0.04207330 -0.04384980 -v 0.27234200 0.00331308 -0.07240070 -v 0.22280200 -0.07885040 -0.14150700 -v 0.30825600 -0.06314530 -0.06191020 -v 0.26804000 -0.06660210 -0.10612400 -v 0.13196400 -0.11113600 -0.18861300 -v 0.18288299 -0.04570920 -0.15746900 -v 0.17621800 -0.09524390 -0.16876800 -v 0.19905201 0.06236560 -0.10598900 -v 0.14891499 0.00578811 -0.16536200 -v 0.19065800 0.00742240 -0.13724101 -v 0.30851001 -0.34008801 0.87540501 -v 0.26310501 -0.28922200 0.90057701 -v 0.21414100 -0.33468100 0.91990298 -v 0.26887000 -0.39635199 0.90975201 -v 0.26699501 -0.33692300 0.90429199 -v 0.25326201 -0.20921400 0.89788198 -v 0.21521600 -0.24472900 0.92060399 -v 0.29389799 -0.25263900 0.86713898 -v 0.25819501 -0.24830100 0.89848202 -v 0.12665600 -0.24041399 0.94502401 -v 0.16480100 -0.28420699 0.93026000 -v 0.17200300 -0.20263700 0.93974000 -v 0.16995500 -0.24235800 0.93533498 -v 0.14973301 -0.39340001 0.92033899 -v 0.10490400 -0.32848701 0.92278099 -v 0.15673000 -0.33263901 0.92412800 -v 0.35845700 -0.20011200 -0.02671620 -v 0.38090101 -0.27724299 0.03267100 -v 0.37598699 -0.34081399 -0.03372680 -v 0.36789501 -0.26385301 -0.03063430 -v 0.34262699 -0.10625700 -0.01566400 -v 0.36960301 -0.16629100 0.04060570 -v 0.34944400 -0.14808300 -0.02178780 -v 0.38518500 -0.21471199 0.17802501 -v 0.38225299 -0.23754200 0.10527700 -v 0.37902501 -0.14983600 0.11276400 -v 0.38088000 -0.19004600 0.10852800 -v 0.37917599 -0.36408600 0.10234300 -v 0.37559599 -0.31114501 0.17593899 -v 0.38139901 -0.29438901 0.10366500 -v 0.36372900 -0.33381701 0.30667400 -v 0.36796501 -0.30765101 0.37043101 -v 0.35140401 -0.35433099 0.42781401 -v 0.35769001 -0.34527600 0.36827999 -v 0.37952501 -0.27860901 0.24367900 -v 0.36970201 -0.32336399 0.24308400 -v 0.38639799 -0.19437400 0.24708401 -v 0.38007900 -0.25263599 0.30995300 -v 0.38442501 -0.23565200 0.24514300 -v 0.36655301 -0.27381200 0.43293601 -v 0.37618801 -0.22098000 0.37440601 -v 0.37362900 -0.26543301 0.37252700 -v 0.36353099 -0.09232410 0.44086701 -v 0.37537900 -0.13255900 0.37767401 -v 0.37622100 -0.08342010 0.31902501 -v 0.35914299 -0.04543760 0.38451701 -v 0.36975399 -0.08878610 0.38033101 -v 0.38363299 -0.16755600 0.31321400 -v 0.37014499 -0.18262100 0.43703800 -v 0.37714800 -0.17665599 0.37591100 -v 0.38642901 -0.13731200 0.18376200 -v 0.38599399 -0.11539700 0.25216901 -v 0.38744399 -0.15466200 0.24911000 -v 0.36932799 -0.03374850 0.26517901 -v 0.38007301 -0.06415950 0.19514100 -v 0.38047901 -0.07546490 0.25720900 -v 0.33101201 0.01716740 0.03897160 -v 0.35796401 -0.03175110 0.07316550 -v 0.33848700 -0.04438260 0.00235778 -v 0.33636600 -0.01572040 0.01752370 -v 0.37698001 -0.08213290 0.12363400 -v 0.36302301 -0.01172890 0.14708200 -v 0.37255099 -0.04874280 0.13308300 -v 0.36302301 -0.09190620 0.05247170 -v 0.37843099 -0.11484800 0.11733100 -v 0.33977401 -0.07312600 -0.00816016 -v 0.33684200 -0.40362000 0.83555198 -v 0.34091100 -0.35059801 0.77666003 -v 0.32472801 -0.29765999 0.82766998 -v 0.33190399 -0.34489799 0.83134902 -v 0.33471599 -0.36029801 0.65417600 -v 0.34067601 -0.30878100 0.71745300 -v 0.33593300 -0.41481301 0.71601403 -v 0.33926299 -0.35642800 0.71587199 -v 0.33868501 -0.22679800 0.72009200 -v 0.33154601 -0.26210499 0.77429497 -v 0.34460899 -0.27126899 0.66124600 -v 0.33961901 -0.26682600 0.71879601 -v 0.31171799 -0.21924300 0.82279402 -v 0.31732699 -0.25730801 0.82474297 -v 0.28298199 -0.09320740 0.86163002 -v 0.30975300 -0.13755700 0.82164198 -v 0.32815000 -0.09827740 0.77445298 -v 0.30429599 -0.05664420 0.81894201 -v 0.30906400 -0.09669120 0.82068998 -v 0.32806301 -0.18247400 0.77391201 -v 0.28425100 -0.17381300 0.86421102 -v 0.30991501 -0.17886700 0.82205200 -v 0.34889099 -0.18653899 0.66664499 -v 0.34226099 -0.14194401 0.72292000 -v 0.34046501 -0.18493199 0.72153002 -v 0.33509699 -0.05545190 0.72479498 -v 0.34985900 -0.09807430 0.67070103 -v 0.34137201 -0.09854540 0.72407198 -v 0.35088700 -0.05075590 0.50291097 -v 0.35760000 -0.09642600 0.55865002 -v 0.36419901 -0.14012399 0.49835199 -v 0.36000401 -0.09479510 0.50037402 -v 0.35668901 -0.14249000 0.61338300 -v 0.34722999 -0.05312970 0.61750901 -v 0.35474399 -0.09744340 0.61549199 -v 0.35205999 -0.23206399 0.60814399 -v 0.36008799 -0.18760900 0.55433798 -v 0.35511199 -0.18759100 0.61099499 -v 0.36305299 -0.23212899 0.49420401 -v 0.36477900 -0.18611200 0.49643299 -v 0.35481200 -0.32010901 0.48807901 -v 0.33880800 -0.35838100 0.54122901 -v 0.34468901 -0.35757601 0.48518899 -v 0.35474601 -0.27766901 0.54823500 -v 0.36033201 -0.27754399 0.49125099 -v 0.34484100 -0.31770900 0.60076302 -v 0.34957799 -0.27522999 0.60464603 -v 0.33502400 -0.36011899 0.59675902 -v 0.25310400 0.20343500 0.11807800 -v 0.22988001 0.24754500 0.15782900 -v 0.25053501 0.21993500 0.20011200 -v 0.27002099 0.18379600 0.15140501 -v 0.25109601 0.21767300 0.15894200 -v 0.17393699 0.29579499 0.15179500 -v 0.20102800 0.27979299 0.20460600 -v 0.20844500 0.25501600 0.09974860 -v 0.20474200 0.27411699 0.15328600 -v 0.19325000 0.26492801 0.29897401 -v 0.22434200 0.24855600 0.24901199 -v 0.16612200 0.29640001 0.25568199 -v 0.19717400 0.27641499 0.25283599 -v 0.27383700 0.17296900 0.23055699 -v 0.24767201 0.20121500 0.28539401 -v 0.24932800 0.21376200 0.24224199 -v 0.26904699 0.11568900 0.41544700 -v 0.24364100 0.16610700 0.37536201 -v 0.21247999 0.17895600 0.42964399 -v 0.23893400 0.13709800 0.47295299 -v 0.24135099 0.14938100 0.42300001 -v 0.21834099 0.21847700 0.33780500 -v 0.27281100 0.14512999 0.31905600 -v 0.24576201 0.18435800 0.32962999 -v 0.15750401 0.26654199 0.34870401 -v 0.18552899 0.22449800 0.38908401 -v 0.18932700 0.24627601 0.34401801 -v 0.17879900 0.18772300 0.48374999 -v 0.14939301 0.22263700 0.43984300 -v 0.18197900 0.20363399 0.43528900 -v 0.23585600 0.07657990 0.80562103 -v 0.21770100 0.11212000 0.77552700 -v 0.18862601 0.11230800 0.82154799 -v 0.21201199 0.07558010 0.84120101 -v 0.21332400 0.09652250 0.81185299 -v 0.22681400 0.13029499 0.68449700 -v 0.19501500 0.14622600 0.73819703 -v 0.24910800 0.09613730 0.72820699 -v 0.22236700 0.12354000 0.73254800 -v 0.13644201 0.17961900 0.75038701 -v 0.16396800 0.14839999 0.78970599 -v 0.16913800 0.17484701 0.69519299 -v 0.16654301 0.16473900 0.74439597 -v 0.15999900 0.09879760 0.86537302 -v 0.13257000 0.13815901 0.83799201 -v 0.16169301 0.12627199 0.83030403 -v 0.20704199 0.15853401 0.53077698 -v 0.23368600 0.13148600 0.57948703 -v 0.26440200 0.10196800 0.52039701 -v 0.23643300 0.13217600 0.52563399 -v 0.14353800 0.19875400 0.53980500 -v 0.17373499 0.17896400 0.58917499 -v 0.17611501 0.18080600 0.53558201 -v 0.20159900 0.15716600 0.63790703 -v 0.13985801 0.19542100 0.64756900 -v 0.17147300 0.17828400 0.64291501 -v 0.25857499 0.10232300 0.62848699 -v 0.23053400 0.13190199 0.63295901 -v 0.34742001 0.00319315 0.33360201 -v 0.32092899 0.03898780 0.39863500 -v 0.33783600 -0.00655256 0.44854900 -v 0.34241900 -0.00261151 0.39086699 -v 0.35121500 0.02042080 0.22141500 -v 0.32742900 0.05668630 0.29107499 -v 0.35097399 0.01086830 0.27702701 -v 0.29874399 0.08941870 0.35544899 -v 0.30120999 0.11503400 0.25778300 -v 0.30070299 0.10200700 0.30564401 -v 0.29323199 0.07110380 0.46040499 -v 0.29602200 0.07865590 0.40707701 -v 0.32812199 -0.01123470 0.67360801 -v 0.30028999 0.02661910 0.72505403 -v 0.30898499 -0.01583640 0.77267897 -v 0.32073799 -0.01337720 0.72489798 -v 0.26734099 0.05736440 0.76982898 -v 0.28185901 0.06745340 0.67711002 -v 0.27574801 0.06347720 0.72593302 -v 0.24017000 0.04575360 0.83834600 -v 0.27488801 0.01831980 0.81225699 -v 0.25629199 0.05014470 0.80725300 -v 0.26850900 -0.01842300 0.85448098 -v 0.29189700 -0.01779180 0.81614202 -v 0.18175299 0.13530301 -0.08485360 -v 0.21303500 0.17002200 -0.00953204 -v 0.23941800 0.10219500 -0.03510770 -v 0.20757000 0.11733500 -0.06161820 -v 0.23652300 0.19578101 0.06091390 -v 0.19029300 0.23705500 0.02589310 -v 0.21226799 0.21811600 0.04486640 -v 0.27658799 0.15557399 0.09810210 -v 0.26527801 0.13337199 0.03535590 -v 0.25864801 0.17368200 0.07686660 -v 0.29829201 0.07298210 0.02717660 -v 0.27054101 0.08746450 -0.00640695 -v 0.31111300 0.03049050 0.62201601 -v 0.28887299 0.06784820 0.57055998 -v 0.28601900 0.06826350 0.62490600 -v 0.33409899 -0.00961306 0.56363499 -v 0.33210200 -0.01022950 0.61961699 -v 0.31518501 0.03113880 0.51057398 -v 0.33553699 -0.00863692 0.50637603 -v 0.29106301 0.06814810 0.51531303 -v 0.33594999 0.04472950 0.11548500 -v 0.32442299 0.07910820 0.18974499 -v 0.34627700 0.03185760 0.16704001 -v 0.30518800 0.10308600 0.10041200 -v 0.32002500 0.05858730 0.06833540 -v 0.29539600 0.13744301 0.16910900 -v 0.28828600 0.14521199 0.12999800 -v 0.29957300 0.12711500 0.21198700 -v 0.14903399 0.11925500 -0.15276700 -v 0.16703400 0.18223000 -0.12279800 -v 0.17731400 0.20481800 -0.05101990 -v 0.16872500 0.15851900 -0.10372900 -v 0.19492100 0.22135700 -0.17301400 -v 0.17716400 0.23811200 -0.09338300 -v 0.16005801 0.16822900 -0.19583800 -v 0.17522800 0.20168100 -0.14661300 -v 0.14972100 0.30080000 -0.00470029 -v 0.16742601 0.25901100 -0.02411110 -v 0.17918000 0.29049700 -0.06097430 -v 0.16855700 0.27236000 -0.04471480 -v 0.15966500 0.28526700 0.04527830 -v 0.17500900 0.24896500 0.00116269 -v 0.23309800 0.21084000 -0.26730099 -v 0.26422000 0.27429301 -0.22820701 -v 0.21819000 0.28199500 -0.13355200 -v 0.22772500 0.24574199 -0.19983700 -v 0.31463900 0.34363899 -0.29252300 -v 0.27621999 0.34481400 -0.17678501 -v 0.30663800 0.26864100 -0.33816600 -v 0.29498500 0.30646899 -0.25924900 -v 0.21453001 0.40777501 -0.03170890 -v 0.22552100 0.34475699 -0.08450030 -v 0.26722199 0.41741401 -0.11644400 -v 0.24980900 0.37920401 -0.09788930 -v 0.17326300 0.34169301 -0.02383790 -v 0.20007300 0.31490800 -0.07321570 -v 0.19266599 0.15982901 -0.30860099 -v 0.24025100 0.15910999 -0.38764900 -v 0.27979699 0.20711701 -0.36698100 -v 0.23872600 0.18198299 -0.33117500 -v 0.21346100 0.12942000 -0.46510801 -v 0.26571500 0.16034199 -0.46921200 -v 0.19545101 0.12849700 -0.40737200 -v 0.23331100 0.14215800 -0.43291599 -v 0.30578700 0.21856301 -0.54744101 -v 0.30739900 0.20821300 -0.46355999 -v 0.25941199 0.16980000 -0.54272199 -v 0.29090101 0.18612599 -0.50914299 -v 0.33078599 0.26947001 -0.44548699 -v 0.31171000 0.23580401 -0.40641800 -v 0.32675001 0.28002700 -0.53593302 -v 0.32100800 0.35265499 -0.51141697 -v 0.32954100 0.34525600 -0.41095600 -v 0.33334500 0.30954200 -0.48018900 -v 0.27251601 0.23958200 -0.60953701 -v 0.29645601 0.29578599 -0.60246998 -v 0.30729499 0.25670701 -0.57883501 -v 0.24054800 0.35766000 -0.62796003 -v 0.28927800 0.35878599 -0.58491802 -v 0.24664500 0.31282699 -0.64033699 -v 0.27430499 0.33102599 -0.61749101 -v 0.29524499 0.43676201 -0.48418701 -v 0.25597599 0.42954901 -0.56362200 -v 0.29539901 0.39544299 -0.54006702 -v 0.33504701 -0.66746998 -0.02619400 -v 0.28831300 -0.71952999 0.02920020 -v 0.23366700 -0.71838301 -0.03946820 -v 0.28891200 -0.66627902 -0.08319810 -v 0.28852299 -0.70492703 -0.03299010 -v 0.27615201 -0.67947698 0.14116000 -v 0.22744200 -0.72474098 0.09338520 -v 0.32704401 -0.67406601 0.08728250 -v 0.28116101 -0.71070403 0.09107580 -v 0.13663100 -0.68612099 0.07876340 -v 0.17279600 -0.72359401 0.02471690 -v 0.18276601 -0.68731201 0.13576700 -v 0.17619100 -0.71615100 0.08578640 -v 0.18744300 -0.66969800 -0.08188190 -v 0.13655201 -0.67510998 -0.02800420 -v 0.17963301 -0.70823300 -0.03502670 -v 0.24609999 -0.67820501 0.88950801 -v 0.19889601 -0.72333503 0.85193002 -v 0.24864200 -0.72451901 0.79089499 -v 0.28821701 -0.67943501 0.83837903 -v 0.24683100 -0.71191198 0.84543198 -v 0.11303300 -0.68417102 0.84496498 -v 0.14866100 -0.72734702 0.79562598 -v 0.15573999 -0.68000400 0.89212102 -v 0.15182900 -0.71393198 0.84914601 -v 0.15797600 -0.69471300 0.69698602 -v 0.19840799 -0.72853202 0.73459101 -v 0.11585900 -0.69348300 0.74811500 -v 0.15304700 -0.72055501 0.74140102 -v 0.28358701 -0.68451500 0.73878503 -v 0.24088000 -0.68868202 0.69162798 -v 0.24443400 -0.71648300 0.73635799 -v 0.34248900 -0.48341900 0.78140998 -v 0.32282001 -0.56595200 0.72619802 -v 0.30390999 -0.49806601 0.66895598 -v 0.33123699 -0.48898301 0.71983600 -v 0.31354001 -0.47457701 0.88789499 -v 0.33133101 -0.55665898 0.84223598 -v 0.33752400 -0.47842500 0.84005100 -v 0.31973201 -0.63345402 0.78642797 -v 0.29419699 -0.61897397 0.88446897 -v 0.31563899 -0.62567300 0.83949602 -v 0.28283000 -0.63256299 0.69100899 -v 0.30832601 -0.63273400 0.73395598 -v 0.06347110 -0.43176499 0.85189903 -v 0.06545670 -0.51587802 0.79543000 -v 0.07747190 -0.57017303 0.85132998 -v 0.09691940 -0.47877800 0.89749497 -v 0.07072340 -0.49632099 0.85239202 -v 0.10668400 -0.53463602 0.68287402 -v 0.08326550 -0.59114403 0.74008697 -v 0.06995600 -0.47422001 0.73529202 -v 0.07736610 -0.52845901 0.73505598 -v 0.08404440 -0.64607000 0.79711801 -v 0.11906300 -0.64767897 0.70201200 -v 0.09434750 -0.64824897 0.74605799 -v 0.11280500 -0.62408799 0.88898599 -v 0.08991110 -0.63452101 0.84727401 -v 0.25237101 -0.58183300 0.65283197 -v 0.20828700 -0.52835000 0.63722301 -v 0.26065099 -0.51361799 0.64239800 -v 0.20034000 -0.65135598 0.66047502 -v 0.24465300 -0.64199400 0.66651398 -v 0.15335000 -0.59564400 0.66033000 -v 0.15643600 -0.65098298 0.67289603 -v 0.15364499 -0.53497797 0.65048897 -v 0.14954300 -0.55442899 0.92281199 -v 0.20939200 -0.47176999 0.92831397 -v 0.14779800 -0.47223601 0.92229402 -v 0.20343600 -0.62816900 0.92307103 -v 0.15358400 -0.62526101 0.91471601 -v 0.26286799 -0.55229598 0.92010802 -v 0.25355101 -0.62293899 0.91265798 -v 0.26773399 -0.47245499 0.91708201 -v 0.34856099 -0.46405399 0.15871599 -v 0.36953700 -0.53841901 0.09612110 -v 0.38743600 -0.44032100 0.02966820 -v 0.37644401 -0.45012999 0.09995990 -v 0.36823601 -0.61497599 0.03062670 -v 0.32555801 -0.61542302 0.13959201 -v 0.35478601 -0.61485100 0.09042980 -v 0.34074199 -0.59789902 -0.07982290 -v 0.37845501 -0.52530801 -0.03562010 -v 0.36408699 -0.60561401 -0.02968130 -v 0.35444501 -0.42785099 -0.08781250 -v 0.38096401 -0.43250400 -0.03617870 -v 0.24351799 -0.43064201 -0.12106200 -v 0.18270101 -0.52784598 -0.10993700 -v 0.12704000 -0.44809899 -0.07357850 -v 0.17913900 -0.43624800 -0.10652800 -v 0.30444300 -0.52128702 -0.11760600 -v 0.30529100 -0.42753699 -0.11546500 -v 0.24192300 -0.60985899 -0.11735900 -v 0.29660100 -0.60296702 -0.10912700 -v 0.14131600 -0.60721701 -0.07303720 -v 0.18696700 -0.60761499 -0.10428700 -v 0.14811499 -0.51256299 0.14992900 -v 0.18853600 -0.57739401 0.17493400 -v 0.25113001 -0.50274497 0.19709399 -v 0.19617701 -0.51176900 0.18354601 -v 0.23306400 -0.63822597 0.17554300 -v 0.14523700 -0.63517803 0.13052000 -v 0.18547399 -0.63848400 0.16224501 -v 0.29378399 -0.55956799 0.18106300 -v 0.28237101 -0.62687701 0.16797701 -v 0.30435699 -0.48421600 0.18995599 -v 0.10571200 -0.54889500 -0.02684320 -v 0.09979460 -0.49246800 0.03527120 -v 0.09537010 -0.40561101 -0.02147820 -v 0.10210700 -0.46993601 -0.02392750 -v 0.10675100 -0.63310802 0.02755670 -v 0.11455200 -0.61964101 -0.02673920 -v 0.11328800 -0.57327300 0.09109930 -v 0.11798800 -0.63583702 0.08280000 -v 0.11251500 -0.45191899 0.09356880 -v 0.11555900 -0.50640398 0.09686390 -v 0.27118400 0.52575898 -0.46007901 -v 0.28535300 0.52085298 -0.36155099 -v 0.30865800 0.43336001 -0.36830500 -v 0.29139099 0.47850701 -0.41852701 -v 0.27805501 0.60076499 -0.32010800 -v 0.28257701 0.53588301 -0.25968099 -v 0.26699999 0.60193098 -0.38818499 -v 0.27864501 0.56397599 -0.33171999 -v 0.24700800 0.54474002 -0.11411400 -v 0.27121401 0.49806699 -0.16797701 -v 0.27787501 0.55689001 -0.19096500 -v 0.27166501 0.53142500 -0.18044600 -v 0.29850900 0.42752200 -0.23628201 -v 0.23533501 0.48553100 -0.06476150 -v 0.27204499 0.45855001 -0.14322500 -v 0.31780201 0.38716999 -0.32758999 -v 0.19262600 0.64757597 -0.12577400 -v 0.26767901 0.61028397 -0.12954900 -v 0.32645199 0.64530897 -0.13850400 -v 0.25236300 0.68216699 -0.15033001 -v 0.25811601 0.64545101 -0.13607000 -v 0.28947100 0.56907398 -0.16246900 -v 0.32434601 0.58771402 -0.15672000 -v 0.23908199 0.57895702 -0.11199600 -v 0.27936101 0.58320802 -0.13702200 -v 0.40158299 0.61271602 -0.19176000 -v 0.38032100 0.61857003 -0.15241300 -v 0.35448000 0.58921301 -0.20256400 -v 0.36784199 0.59746701 -0.17194000 -v 0.38868201 0.68040597 -0.14489301 -v 0.43034899 0.65827698 -0.15438201 -v 0.38479200 0.64790797 -0.14370400 -v 0.29443899 0.59184903 -0.26603901 -v 0.31835899 0.58466601 -0.23009400 -v 0.29431799 0.57272899 -0.20987099 -v 0.28588000 0.66204900 -0.34908900 -v 0.31260601 0.63866800 -0.31912401 -v 0.29037201 0.62410802 -0.31778800 -v 0.37588099 0.66250497 -0.31082100 -v 0.34396699 0.62006801 -0.28688699 -v 0.34507900 0.68132699 -0.33315599 -v 0.34176999 0.64910698 -0.31847700 -v 0.38059101 0.61458200 -0.24553500 -v 0.34736300 0.59842497 -0.24456500 -v 0.39374301 0.70676500 -0.31230000 -v 0.44419700 0.71139401 -0.26325601 -v 0.41957200 0.65870601 -0.26189199 -v 0.41295800 0.68594301 -0.29112801 -v 0.45258901 0.74444401 -0.20681600 -v 0.47155201 0.70857900 -0.19918400 -v 0.43241000 0.74645501 -0.25830299 -v 0.46079201 0.73083103 -0.23106299 -v 0.44728899 0.65595597 -0.19680300 -v 0.44739699 0.70239198 -0.15815000 -v 0.46033701 0.68144798 -0.17325000 -v 0.41730300 0.63371301 -0.22525600 -v 0.00000000 0.32409400 0.18016499 -v 0.04624360 0.32016400 0.22133701 -v 0.09255390 0.32013899 0.17069900 -v 0.04673820 0.32528400 0.13673900 -v 0.04689910 0.32370701 0.17766000 -v 0.04348920 0.30184999 0.31193399 -v 0.08864910 0.31239599 0.26343501 -v 0.00000000 0.31281200 0.26784599 -v 0.04502310 0.31332299 0.26651499 -v 0.13293600 0.31206101 0.21048500 -v 0.12562799 0.29656401 0.30682901 -v 0.12948100 0.30757499 0.25951901 -v 0.13529900 0.30831999 0.11259800 -v 0.13572000 0.31098601 0.15983801 -v 0.00000000 0.22816400 0.54779798 -v 0.03645170 0.22520000 0.60147899 -v 0.07353270 0.22129300 0.54570597 -v 0.03778270 0.23206501 0.49518800 -v 0.03698680 0.22652601 0.54725999 -v 0.03577810 0.21867900 0.71024901 -v 0.07171530 0.21825500 0.65442002 -v 0.00000000 0.22586000 0.65700102 -v 0.03608090 0.22396000 0.65631902 -v 0.10765100 0.21008600 0.59707898 -v 0.10538400 0.20391700 0.70475501 -v 0.10645600 0.20874301 0.65145397 -v 0.11132500 0.21911100 0.49138901 -v 0.10919700 0.21214300 0.54320103 -v 0.00000000 0.20702000 0.76263499 -v 0.03503300 0.18494000 0.80962300 -v 0.07035920 0.19998699 0.75926501 -v 0.03544690 0.20523199 0.76174200 -v 0.03374030 0.12911899 0.88985199 -v 0.06842860 0.15476100 0.84948599 -v 0.00000000 0.16064200 0.85389102 -v 0.03448220 0.15912800 0.85271800 -v 0.10286000 0.17231099 0.80234700 -v 0.09948050 0.11870500 0.88073701 -v 0.10130300 0.14771301 0.84448099 -v 0.10420200 0.19140901 0.75541198 -v 0.00000000 -0.42223600 0.02975180 -v 0.02900270 -0.40133601 0.00260959 -v 0.06198550 -0.41945401 0.05164050 -v 0.03254400 -0.43333599 0.06844560 -v 0.03121420 -0.42003599 0.03584000 -v 0.02458700 -0.35025501 -0.06699270 -v 0.05249890 -0.37448600 -0.02686580 -v 0.00000000 -0.38146999 -0.03411370 -v 0.02657260 -0.37786600 -0.03156240 -v 0.08043860 -0.40757701 0.02501200 -v 0.07813920 -0.34340200 -0.06802910 -v 0.07713270 -0.37876499 -0.02298100 -v 0.10198100 -0.43742001 0.11887300 -v 0.09187120 -0.42650899 0.07468890 -v 0.00000000 -0.36965501 0.85316497 -v 0.01621420 -0.39685801 0.80846900 -v 0.03251800 -0.37795499 0.85121697 -v 0.01734990 -0.34089699 0.89134800 -v 0.01611030 -0.37073299 0.85231900 -v 0.01905710 -0.43673500 0.72386903 -v 0.03522630 -0.42631099 0.75720203 -v 0.00000000 -0.41748500 0.76640898 -v 0.01731270 -0.41896200 0.76418900 -v 0.04736930 -0.42307901 0.79981500 -v 0.06414990 -0.45469299 0.69653797 -v 0.05434170 -0.44244999 0.74512202 -v 0.05769740 -0.36046901 0.89382201 -v 0.04952040 -0.39530399 0.85129201 -v 0.00000000 0.28401199 0.35682899 -v 0.04034070 0.26458400 0.40090001 -v 0.08278000 0.28322300 0.35483801 -v 0.04189350 0.28441101 0.35633799 -v 0.07723610 0.24253701 0.44549799 -v 0.00000000 0.24665999 0.44719100 -v 0.03893550 0.24594299 0.44679201 -v 0.11778700 0.25622001 0.39730799 -v 0.11426700 0.23518600 0.44321400 -v 0.12165200 0.27806199 0.35230201 -v 0.00000000 0.33774400 0.04957880 -v 0.04415740 0.32911900 0.06931120 -v 0.08477700 0.33113399 0.03926020 -v 0.04486640 0.35103601 0.03689170 -v 0.04362810 0.33652899 0.04754100 -v 0.08917090 0.32058299 0.09065030 -v 0.00000000 0.32732701 0.10250500 -v 0.04550920 0.32622901 0.09983350 -v 0.12257900 0.31142899 0.04368310 -v 0.12913699 0.30803400 0.07378640 -v 0.12556900 0.33518001 0.01101010 -v 0.12096800 0.31980699 0.02256890 -v 0.00000000 0.45058101 0.05968030 -v 0.05410980 0.40816000 0.04837140 -v 0.11650300 0.44225600 0.03993080 -v 0.06322840 0.49669299 0.05228520 -v 0.05937080 0.44895500 0.05511930 -v 0.09543460 0.37017900 0.02982700 -v 0.00000000 0.37634000 0.04209730 -v 0.04881770 0.37521699 0.03973200 -v 0.15343800 0.39127699 0.01214460 -v 0.13765000 0.35956001 0.00957340 -v 0.18104000 0.47003901 0.00485434 -v 0.16915900 0.42866001 0.01260960 -v 0.00000000 0.57089102 -0.53467202 -v 0.06264850 0.64018899 -0.50604600 -v 0.13013600 0.56800401 -0.52876401 -v 0.06927610 0.50558197 -0.56204200 -v 0.06647380 0.57021600 -0.53352499 -v 0.05367940 0.76236802 -0.44766399 -v 0.11320100 0.70172602 -0.47450501 -v 0.00000000 0.70916402 -0.47933799 -v 0.05823790 0.70705497 -0.47797099 -v 0.19990499 0.68549699 -0.46249601 -v 0.17402500 0.63237703 -0.49522299 -v 0.15053301 0.74404299 -0.44196001 -v 0.16161400 0.69417500 -0.46957600 -v 0.19918700 0.49891999 -0.54566801 -v 0.23204701 0.56521600 -0.50191802 -v 0.18817300 0.56406599 -0.51907003 -v 0.00000000 0.37647501 -0.64878798 -v 0.07118110 0.41327500 -0.62329203 -v 0.13828200 0.37568101 -0.64542401 -v 0.07269580 0.34095699 -0.66479897 -v 0.07164650 0.37681499 -0.64841598 -v 0.13882101 0.45291701 -0.58905399 -v 0.00000000 0.45451999 -0.59399498 -v 0.07061810 0.45473301 -0.59323299 -v 0.19987300 0.40474799 -0.61293501 -v 0.20219500 0.44661400 -0.57956702 -v 0.19363400 0.33949900 -0.65286601 -v 0.19489500 0.37092099 -0.63793802 -v 0.00000000 -0.23354900 0.95987701 -v 0.02404680 -0.27183500 0.94326401 -v 0.05712300 -0.23592199 0.95662099 -v 0.03063990 -0.19572800 0.97028500 -v 0.02778580 -0.23425201 0.95913899 -v 0.04255270 -0.31146300 0.92105299 -v 0.00000000 -0.30691600 0.92140502 -v 0.02028170 -0.30765700 0.92116499 -v 0.08027690 -0.27776399 0.93951499 -v 0.06880230 -0.31991801 0.92167401 -v 0.09568030 -0.19945499 0.96067601 -v 0.08956270 -0.23812200 0.95201802 -v 0.00000000 -0.32273301 -0.10339700 -v 0.02383670 -0.28310299 -0.13984300 -v 0.04954700 -0.31195599 -0.10581700 -v 0.02370900 -0.31913400 -0.10399800 -v 0.02670240 -0.19071800 -0.19711100 -v 0.05210080 -0.23408000 -0.17368300 -v 0.00000000 -0.24292900 -0.17041500 -v 0.02486840 -0.24076501 -0.17179200 -v 0.08162430 -0.26418900 -0.14448500 -v 0.08780740 -0.17651300 -0.19394100 -v 0.08406110 -0.22268499 -0.17384700 -v 0.07964330 -0.30481899 -0.10887100 -v 0.00000000 -0.13232100 -0.21383201 -v 0.03218710 -0.06915960 -0.22273099 -v 0.05997510 -0.12838800 -0.20946699 -v 0.02923670 -0.13156500 -0.21306400 -v 0.03819810 0.04199610 -0.23552600 -v 0.07139020 -0.00682142 -0.21557200 -v 0.00000000 -0.00964083 -0.23373400 -v 0.03526900 -0.00935459 -0.22919200 -v 0.10108700 -0.06207190 -0.20036399 -v 0.11567400 0.05510500 -0.18788300 -v 0.10921600 -0.00036684 -0.19288400 -v 0.09371690 -0.12188200 -0.20174800 -v 0.00000000 0.07791490 -0.25163600 -v 0.04289260 0.10338600 -0.25797701 -v 0.08037110 0.08445670 -0.22527100 -v 0.04069010 0.07903880 -0.24481399 -v 0.04702120 0.12044300 -0.29962599 -v 0.08843310 0.12572999 -0.25853300 -v 0.00000000 0.11413600 -0.28248501 -v 0.04495370 0.11665000 -0.27594000 -v 0.12092200 0.12485500 -0.20936300 -v 0.13847800 0.14859501 -0.26506901 -v 0.12896401 0.14291801 -0.23248801 -v 0.11803400 0.09621500 -0.19393501 -v 0.00000000 0.11380100 -0.33466399 -v 0.05189470 0.10885300 -0.36575300 -v 0.09799900 0.12487800 -0.31997600 -v 0.04924290 0.11637700 -0.32995600 -v 0.05959190 0.10102400 -0.44902599 -v 0.10754100 0.10703100 -0.40186101 -v 0.00000000 0.10100900 -0.40827599 -v 0.05525250 0.10226800 -0.40583599 -v 0.15091100 0.12632200 -0.35627100 -v 0.16045000 0.11291500 -0.44107899 -v 0.15390100 0.11628100 -0.39969701 -v 0.14578199 0.14007799 -0.30886301 -v 0.00000000 0.10917700 -0.49514499 -v 0.07099820 0.12670900 -0.53864199 -v 0.12555100 0.11227900 -0.49019599 -v 0.06518900 0.10952000 -0.49414301 -v 0.07907180 0.18298800 -0.61559898 -v 0.14749999 0.15385400 -0.57533199 -v 0.00000000 0.15122600 -0.58058900 -v 0.07597430 0.15154700 -0.57997602 -v 0.19494399 0.13480601 -0.52334601 -v 0.21930100 0.19138700 -0.60018897 -v 0.21012899 0.15949000 -0.56384999 -v 0.17625800 0.11918600 -0.48235899 -v 0.00000000 0.21957600 -0.64341998 -v 0.07754250 0.26020601 -0.66100198 -v 0.15404400 0.22256400 -0.63894099 -v 0.07924550 0.21998700 -0.64296502 -v 0.14437801 0.30253401 -0.66520798 -v 0.00000000 0.30096900 -0.66890901 -v 0.07501020 0.30130899 -0.66863698 -v 0.21377200 0.26767001 -0.64780301 -v 0.20246300 0.30485100 -0.65600902 -v 0.21995001 0.22864801 -0.62868500 -v 0.12671500 0.53733701 0.01114680 -v 0.06068840 0.60785002 0.00104436 -v 0.00000000 0.55440801 0.04085670 -v 0.06431070 0.55046302 0.03217850 -v 0.19163699 0.55023301 -0.04775240 -v 0.18530799 0.51374298 -0.01723540 -v 0.17116500 0.60579902 -0.07642890 -v 0.20970100 0.56996799 -0.08078950 -v 0.12609600 0.69556999 -0.12707099 -v 0.09874660 0.65678602 -0.06244700 -v 0.14282399 0.65092599 -0.09699060 -v 0.00000000 0.67221898 -0.02282650 -v 0.04035170 0.71829998 -0.07190160 -v 0.05043260 0.66644198 -0.03487200 -v 0.23761401 0.63046801 -0.46987301 -v 0.25851399 0.60219699 -0.44519901 -v 0.25321701 0.57826900 -0.47478300 -v 0.21289600 0.71490502 -0.42843500 -v 0.24094300 0.66222399 -0.43893999 -v 0.22450100 0.67678899 -0.45257801 -v 0.24652900 0.67247999 -0.39795199 -v 0.25477099 0.63597602 -0.42070001 -v 0.22643600 0.91272300 -0.26973000 -v 0.21544001 0.93868101 -0.27942300 -v 0.20101400 0.94333798 -0.25145000 -v 0.21422400 0.91667199 -0.24604601 -v 0.21696500 0.93182498 -0.26116699 -v 0.19691700 0.92767602 -0.31154600 -v 0.19187599 0.94898897 -0.28837800 -v 0.21686199 0.91893601 -0.30396500 -v 0.20763400 0.93773198 -0.29671001 -v 0.15369999 0.94325203 -0.26905400 -v 0.17745000 0.95364600 -0.26040500 -v 0.16591200 0.93930298 -0.29273900 -v 0.17310899 0.95103502 -0.27783501 -v 0.17980100 0.93094498 -0.23207000 -v 0.15985601 0.93968600 -0.23965099 -v 0.18078300 0.94641101 -0.24463500 -v 0.20781399 0.75986898 -0.30298999 -v 0.19143800 0.77473402 -0.31202200 -v 0.19908400 0.77337003 -0.28140500 -v 0.20999600 0.76187599 -0.26835799 -v 0.20173401 0.76712698 -0.28955001 -v 0.16174300 0.79314101 -0.34275800 -v 0.17822100 0.78837401 -0.32557499 -v 0.18095601 0.77960002 -0.34143999 -v 0.17835701 0.78372800 -0.33126199 -v 0.18742000 0.81174302 -0.32153201 -v 0.19238700 0.78909200 -0.30184200 -v 0.16581900 0.80441803 -0.33528799 -v 0.18106800 0.79666799 -0.32284400 -v 0.20217501 0.77548200 -0.25199699 -v 0.20323300 0.79747200 -0.27393201 -v 0.19922100 0.78193003 -0.27640000 -v 0.18133600 0.80431700 -0.22860600 -v 0.15141501 0.80164802 -0.21548200 -v 0.16850300 0.78144699 -0.21054100 -v 0.19251600 0.77793801 -0.22775900 -v 0.17426801 0.78915602 -0.22056501 -v 0.10834500 0.82291901 -0.22107500 -v 0.12229000 0.80530900 -0.21138600 -v 0.13532700 0.82857198 -0.21789400 -v 0.12826200 0.81335503 -0.21546400 -v 0.10307100 0.80025703 -0.19801299 -v 0.13743401 0.78917599 -0.20042001 -v 0.09630230 0.81256300 -0.21585000 -v 0.11477300 0.80181599 -0.20559201 -v 0.18617500 0.76688200 -0.20473900 -v 0.15363801 0.77253902 -0.19137600 -v 0.16229200 0.77673697 -0.20086101 -v 0.13845000 0.80167699 -0.35068500 -v 0.11915900 0.80980402 -0.33135101 -v 0.14332899 0.80462700 -0.33725199 -v 0.14084400 0.80200201 -0.34199801 -v 0.08600300 0.82045799 -0.29130399 -v 0.10501000 0.81788200 -0.31015700 -v 0.09345540 0.81754899 -0.31885299 -v 0.10018500 0.81604201 -0.31318501 -v 0.11661400 0.84024799 -0.30805099 -v 0.12769599 0.81920600 -0.32520199 -v 0.09615670 0.82966602 -0.28883499 -v 0.10984800 0.82523102 -0.30877700 -v 0.15371300 0.82696599 -0.33402401 -v 0.14719100 0.81209999 -0.33505601 -v 0.07101790 0.82433498 -0.27068201 -v 0.07809190 0.82257599 -0.24892800 -v 0.08405400 0.82463801 -0.26886401 -v 0.07869610 0.82279497 -0.26951301 -v 0.08994790 0.82157499 -0.23211500 -v 0.07516750 0.81987900 -0.22852901 -v 0.08401800 0.81932402 -0.23066799 -v 0.10202900 0.84389198 -0.23298900 -v 0.08880810 0.83189201 -0.24922299 -v 0.09520300 0.82898098 -0.23288301 -v 0.09598180 0.84702802 -0.26789799 -v 0.08913480 0.83200300 -0.26842901 -v 0.20807600 0.76441503 -0.24178900 -v 0.22607499 0.75999397 -0.24085800 -v 0.23190200 0.75422299 -0.26947001 -v 0.21697199 0.75995201 -0.25295600 -v 0.20189001 0.76557398 -0.22074001 -v 0.20185401 0.77005100 -0.23411199 -v 0.21575899 0.75767303 -0.20046200 -v 0.22344400 0.76045102 -0.21768899 -v 0.20591199 0.76199198 -0.20987900 -v 0.26414400 0.76081598 -0.24392299 -v 0.26510301 0.76085198 -0.22018901 -v 0.24071400 0.76064098 -0.22957601 -v 0.27899501 0.75125498 -0.27923799 -v 0.27785799 0.72749799 -0.31952301 -v 0.23487200 0.74279898 -0.30628601 -v 0.25622401 0.74478602 -0.29318401 -v 0.31116700 0.76368499 -0.23617300 -v 0.34396499 0.75661701 -0.26972100 -v 0.30016100 0.75923097 -0.25911301 -v 0.37536001 0.73814797 -0.30116001 -v 0.40268499 0.75864297 -0.23620100 -v 0.39075801 0.75370502 -0.27032000 -v 0.31798601 0.70804697 -0.33357701 -v 0.35820499 0.71251500 -0.32474500 -v 0.25823599 0.69355202 -0.35688299 -v 0.28472599 0.69821602 -0.34391299 -v 0.18352900 0.75471401 -0.18893500 -v 0.24865100 0.73777300 -0.18065999 -v 0.27737600 0.75325102 -0.19712600 -v 0.23327000 0.75098401 -0.19142200 -v 0.32984501 0.71293199 -0.15926801 -v 0.17877901 0.71813500 -0.16643000 -v 0.25211200 0.71388698 -0.16607800 -v 0.40900299 0.73616701 -0.17431401 -v 0.39941999 0.71099401 -0.15505700 -v 0.35261700 0.75679600 -0.20856500 -v 0.40942901 0.75242400 -0.20278101 -v 0.30345601 0.75958800 -0.21377601 -v 0.07050060 0.81175297 -0.20580700 -v 0.06026610 0.79742497 -0.17779700 -v 0.10674100 0.78208202 -0.17896900 -v 0.08454510 0.79801500 -0.18858100 -v 0.00000000 0.80352002 -0.16012999 -v 0.03596380 0.78174502 -0.13792001 -v 0.02587440 0.81445599 -0.19275001 -v 0.03130390 0.80082399 -0.16616000 -v 0.07716880 0.74413401 -0.12858200 -v 0.00000000 0.76045400 -0.09539150 -v 0.03725420 0.75548601 -0.10637600 -v 0.12835200 0.75367999 -0.16956000 -v 0.12240400 0.72995102 -0.15126599 -v 0.14054400 0.76636398 -0.18193600 -v 0.02698070 0.83276302 -0.30695599 -v 0.06475640 0.82400799 -0.33702099 -v 0.04380170 0.81809801 -0.37741199 -v 0.00000000 0.83131200 -0.34244400 -v 0.03522380 0.82871902 -0.34138700 -v 0.10544600 0.81232399 -0.35213101 -v 0.06737290 0.82510000 -0.29944599 -v 0.08290650 0.82024503 -0.32815400 -v 0.16394800 0.78761297 -0.36637199 -v 0.13414800 0.79462701 -0.38492000 -v 0.13486201 0.80110800 -0.36470199 -v 0.09685680 0.78937602 -0.41177201 -v 0.17651300 0.76051497 -0.41065499 -v 0.14037500 0.77656603 -0.41220701 -v 0.00000000 0.80070800 -0.41488901 -v 0.04941050 0.79768097 -0.41349101 -v 0.04313160 0.82238102 -0.22249800 -v 0.02095850 0.83068001 -0.24671701 -v 0.00000000 0.82550502 -0.21776900 -v 0.02227520 0.82437903 -0.21934099 -v 0.05710550 0.82586402 -0.24803400 -v 0.06115060 0.82088900 -0.22568400 -v 0.04271430 0.83040601 -0.27463099 -v 0.05897610 0.82712102 -0.27268001 -v 0.00000000 0.83490402 -0.27594501 -v 0.02237630 0.83344501 -0.27566099 -v 0.19233300 0.76123601 -0.37858400 -v 0.22089300 0.72350299 -0.39026499 -v 0.20182000 0.74248701 -0.40297601 -v 0.20250300 0.75901300 -0.34223801 -v 0.18549700 0.77285498 -0.35764301 -v 0.22914700 0.73045999 -0.34861901 -v 0.21796399 0.74826801 -0.32387799 -v 0.23832799 0.70458603 -0.37361699 -v 0.18263800 0.84416300 -0.33275101 -v 0.20855001 0.86608899 -0.31715700 -v 0.20815399 0.83004200 -0.29894799 -v 0.19779600 0.83673102 -0.32010600 -v 0.22543500 0.89132398 -0.29361200 -v 0.20208800 0.89860898 -0.32218999 -v 0.21603601 0.89427298 -0.31127900 -v 0.22171301 0.88575298 -0.25337401 -v 0.22169000 0.85672402 -0.27353600 -v 0.22722200 0.88688397 -0.27308300 -v 0.20747299 0.82397902 -0.24925900 -v 0.21220900 0.82466203 -0.27339801 -v 0.11365400 0.86959702 -0.28724399 -v 0.14018799 0.89349502 -0.30485401 -v 0.14488900 0.85895002 -0.32316700 -v 0.12722500 0.86509401 -0.30698600 -v 0.17040700 0.91557401 -0.31453699 -v 0.14127800 0.92125100 -0.28396401 -v 0.15401100 0.91917700 -0.30092499 -v 0.17602000 0.88051999 -0.32949901 -v 0.18665500 0.90721399 -0.32245100 -v 0.16418099 0.85177201 -0.33276400 -v 0.12592100 0.86272401 -0.22203700 -v 0.12623499 0.89679199 -0.23275700 -v 0.10627800 0.87162000 -0.24805900 -v 0.11267200 0.86865801 -0.23244600 -v 0.13670599 0.92653197 -0.24913400 -v 0.15282500 0.91465199 -0.22656800 -v 0.14181800 0.92180699 -0.23542500 -v 0.12026400 0.90000701 -0.26615700 -v 0.13601799 0.92502499 -0.26600701 -v 0.10663800 0.87185198 -0.26696301 -v 0.20172501 0.86322701 -0.23457800 -v 0.16929699 0.84265298 -0.22227800 -v 0.19145800 0.83138102 -0.23233400 -v 0.19173500 0.90228200 -0.22820900 -v 0.20922901 0.89273101 -0.23816600 -v 0.15872400 0.88235098 -0.22015500 -v 0.17119899 0.90886599 -0.22425300 -v 0.14612401 0.85357898 -0.21874700 -v 0.18364100 -0.45548901 0.53437901 -v 0.20511000 -0.46183699 0.47550201 -v 0.22836500 -0.44618100 0.42097700 -v 0.21325999 -0.45030299 0.47853899 -v 0.10298100 -0.46572301 0.63297403 -v 0.14255901 -0.46666899 0.57468998 -v 0.14378700 -0.46224299 0.58791399 -v 0.13203301 -0.48116699 0.55678099 -v 0.17086001 -0.47463101 0.52178901 -v 0.10955200 -0.47205701 0.59548497 -v 0.14084899 -0.47345799 0.56331599 -v 0.20666300 -0.47250500 0.41862601 -v 0.17688100 -0.48852000 0.46999100 -v 0.19497500 -0.47463101 0.47242799 -v 0.04399950 -0.45392901 0.68206298 -v 0.07558920 -0.46538699 0.63901800 -v 0.07050610 -0.46108299 0.66338903 -v 0.00000000 -0.44861299 0.69461000 -v 0.02382680 -0.46053001 0.66417098 -v 0.02109840 -0.44986999 0.69190103 -v 0.03290530 -0.48309401 0.60496801 -v 0.05493510 -0.47109100 0.62964201 -v 0.00000000 -0.47079900 0.63853902 -v 0.02763240 -0.47088301 0.63656503 -v 0.09177580 -0.47903401 0.59150499 -v 0.08157810 -0.47137499 0.61677098 -v 0.06574100 -0.44011101 0.11972600 -v 0.03176460 -0.44535199 0.13427600 -v 0.00000000 -0.44149101 0.09417190 -v 0.03232910 -0.44060600 0.10074300 -v 0.13801500 -0.44389501 0.19228099 -v 0.09651980 -0.44483399 0.17566200 -v 0.10131900 -0.44216701 0.15038900 -v 0.09812780 -0.45727900 0.23067699 -v 0.06361230 -0.45002800 0.18216100 -v 0.12410200 -0.45071900 0.22868399 -v 0.09422010 -0.44950101 0.20111801 -v 0.00000000 -0.45173800 0.16665199 -v 0.03436800 -0.46129599 0.21122900 -v 0.03204580 -0.45107999 0.17059000 -v 0.20566100 -0.44092301 0.30331001 -v 0.16353600 -0.44768500 0.25595900 -v 0.17478500 -0.44241399 0.24495000 -v 0.21309499 -0.45442501 0.36305001 -v 0.22467700 -0.44261599 0.36227700 -v 0.17834400 -0.48112300 0.36405200 -v 0.17953700 -0.46082601 0.31165999 -v 0.19938900 -0.46730000 0.36377200 -v 0.13838500 -0.46258301 0.27146500 -v 0.15349101 -0.45489699 0.26608101 -v 0.00000000 -0.50135398 0.56625801 -v 0.04728840 -0.51530099 0.51927400 -v 0.07741590 -0.49456000 0.56247997 -v 0.04003560 -0.49932900 0.56526798 -v 0.05522190 -0.52932101 0.41564399 -v 0.10237400 -0.51682699 0.46860501 -v 0.00000000 -0.53078002 0.46900299 -v 0.05292880 -0.52672702 0.46879601 -v 0.12906000 -0.49717501 0.51701897 -v 0.15177600 -0.50386500 0.41666499 -v 0.14485300 -0.50333798 0.46885899 -v 0.10948500 -0.48835400 0.55807698 -v 0.00000000 -0.52277100 0.36117700 -v 0.04664100 -0.50043201 0.30843100 -v 0.10172700 -0.50906599 0.36254600 -v 0.05243280 -0.51879603 0.36162800 -v 0.07789560 -0.47493100 0.26187500 -v 0.00000000 -0.48152399 0.25622901 -v 0.03992620 -0.47950599 0.25773701 -v 0.12954000 -0.48295301 0.31286201 -v 0.11195100 -0.46927500 0.26825699 -v 0.14474300 -0.49577701 0.36349899 -v 0.16267000 -0.02974630 0.94759703 -v 0.13789700 -0.02982650 0.96106100 -v 0.13904200 -0.04516330 0.96365899 -v 0.16463099 -0.05044890 0.95117599 -v 0.15000699 -0.03816100 0.95703399 -v 0.10933100 -0.03044080 0.97429299 -v 0.12246200 -0.03791400 0.96996301 -v 0.13096800 -0.01354590 0.95685101 -v 0.12417200 -0.02738950 0.96625900 -v 0.13371401 -0.06424990 0.96541601 -v 0.10985100 -0.05167940 0.97628301 -v 0.12524500 -0.04877810 0.96961898 -v 0.17278200 -0.08126710 0.94765103 -v 0.21391800 -0.07802200 0.92284101 -v 0.18873000 -0.04347480 0.93576401 -v 0.18590300 -0.06474600 0.94048601 -v 0.11975800 -0.09111090 0.96806699 -v 0.16388200 -0.12098900 0.94927102 -v 0.14906500 -0.08859750 0.95754498 -v 0.20986700 -0.16157299 0.92524397 -v 0.13300100 -0.16112401 0.95695603 -v 0.17075400 -0.16059101 0.94386101 -v 0.24743000 -0.12519400 0.89874500 -v 0.24930000 -0.16701400 0.89865100 -v 0.24751700 -0.05165720 0.89181501 -v 0.24877200 -0.08724670 0.89611799 -v 0.20664100 -0.01686250 0.91318297 -v 0.16595300 -0.00373407 0.93417901 -v 0.18156300 -0.02189410 0.93320000 -v 0.22559699 0.01651320 0.87835401 -v 0.23785700 -0.01690930 0.88688499 -v 0.18850800 0.05557700 0.88186097 -v 0.21654201 0.04812670 0.86324698 -v 0.12871300 0.07767570 0.90259999 -v 0.15503700 0.03421590 0.91836500 -v 0.15916701 0.06641780 0.89409399 -v 0.11669800 0.01460290 0.94810200 -v 0.14344700 0.00727528 0.94008499 -v 0.02724410 0.00174637 0.98536801 -v 0.05910530 0.02739470 0.96148002 -v 0.03141290 0.06261800 0.94454902 -v 0.00000000 0.03124900 0.96748298 -v 0.02961240 0.03040810 0.96577698 -v 0.09394430 0.05321890 0.93428999 -v 0.08029690 -0.00539620 0.97496098 -v 0.08835910 0.02171780 0.95541102 -v 0.06527620 0.09255390 0.91593999 -v 0.09733950 0.08637760 0.91003603 -v 0.00000000 0.09745220 0.92130899 -v 0.03275300 0.09623530 0.91985202 -v 0.06409970 -0.15863200 0.97403598 -v 0.03139180 -0.12188700 0.98399198 -v 0.00000000 -0.15632300 0.97955298 -v 0.03174970 -0.15708500 0.97819602 -v 0.09565230 -0.12370700 0.97208500 -v 0.09765010 -0.16022500 0.96698499 -v 0.08100190 -0.07337970 0.98285502 -v 0.05977000 -0.09423440 0.98418999 -v 0.08986710 -0.09318110 0.97711402 -v 0.00000000 -0.09303160 0.99047798 -v 0.02737840 -0.07608180 0.99372101 -v 0.02984250 -0.09369760 0.98879302 -v 0.09559990 -0.04769730 0.98596901 -v 0.07892690 -0.06284000 0.99495900 -v 0.08645290 -0.06401660 0.98579001 -v 0.09409510 -0.05654120 0.98501998 -v 0.08610680 -0.03064330 0.98915303 -v 0.07884250 -0.04882710 1.00064003 -v 0.09387690 -0.03857120 0.98682803 -v 0.05250090 -0.06621290 1.02310002 -v 0.06663470 -0.06440790 1.00864005 -v 0.05984110 -0.05361980 1.01768005 -v 0.06526080 -0.05825490 1.01250994 -v 0.05989890 -0.07533910 1.00400996 -v 0.05252760 -0.07753740 1.01482999 -v 0.06529460 -0.07005230 1.00522995 -v 0.04761840 -0.02239710 1.00059998 -v 0.05825980 -0.04039760 1.01189995 -v 0.06947060 -0.02539400 0.99450201 -v 0.00000000 -0.02109750 1.00705004 -v 0.02090470 -0.03967700 1.02316999 -v 0.02420060 -0.02122640 1.00514996 -v 0.01524620 -0.06768010 1.04602003 -v 0.03448460 -0.05343020 1.03232002 -v 0.00000000 -0.05555410 1.03945994 -v 0.01777890 -0.05477260 1.03744996 -v 0.04265670 -0.06275880 1.03251004 -v 0.04904390 -0.05252870 1.02500999 -v 0.04778560 -0.07182530 0.99557102 -v 0.02094760 -0.07797370 1.00715995 -v 0.00000000 -0.07249050 1.00177002 -v 0.02427570 -0.07260370 0.99989498 -v 0.05838710 -0.07357600 0.99823302 -v 0.06976390 -0.06903710 0.99008799 -v 0.04270120 -0.08547580 1.01505005 -v 0.03453510 -0.08452830 1.01120996 -v 0.04910570 -0.08041930 1.00671005 -v 0.00000000 -0.08765520 1.01738000 -v 0.01526670 -0.09409940 1.02437997 -v 0.01780690 -0.08690210 1.01538002 -v 0.02714440 -0.07633090 1.04138994 -v 0.03949090 -0.07962540 1.02906001 -v 0.03993180 -0.07205890 1.03309000 -v 0.00000000 -0.08092510 1.04900002 -v 0.01322720 -0.08893160 1.04223001 -v 0.01372910 -0.07956640 1.04691994 -v 0.02716370 -0.09052630 1.02914000 -v 0.00000000 -0.09562020 1.03609002 -v 0.01374000 -0.09427590 1.03401995 -v 0.03995510 -0.08465440 1.02277005 -v -0.34129900 -0.37594399 0.36623201 -v -0.31781799 -0.39242300 0.30548501 -v -0.28963801 -0.41198400 0.36304399 -v -0.31312099 -0.40468001 0.42430300 -v -0.31728801 -0.39729500 0.36444801 -v -0.31249499 -0.42258000 0.20841500 -v -0.27484599 -0.41875401 0.25265801 -v -0.35028401 -0.36445299 0.24478300 -v -0.31660101 -0.39641601 0.25019899 -v -0.19481701 -0.43740201 0.23935799 -v -0.25154400 -0.42243499 0.30233201 -v -0.20990001 -0.45762199 0.20231800 -v -0.23121101 -0.43096599 0.24548601 -v -0.26163200 -0.42722100 0.42270100 -v -0.23935001 -0.43199000 0.36184201 -v -0.26233199 -0.42266399 0.36213699 -v -0.27502501 -0.42194900 0.48206699 -v -0.29136199 -0.41337901 0.53681499 -v -0.32816201 -0.38769600 0.48308301 -v -0.30342600 -0.40822199 0.48226500 -v -0.22539900 -0.44019300 0.48087099 -v -0.22298899 -0.43942100 0.53834999 -v -0.24750200 -0.43167400 0.48182499 -v -0.16401100 -0.48303300 0.63140601 -v -0.23656400 -0.44422799 0.58447599 -v -0.15611900 -0.45852599 0.59578902 -v -0.19114301 -0.45386100 0.59111798 -v -0.31511101 -0.39767900 0.59214598 -v -0.26978999 -0.45549300 0.62400299 -v -0.28008899 -0.42560801 0.58643502 -v -0.33951899 -0.25718200 -0.08028310 -v -0.28353500 -0.19808300 -0.11242000 -v -0.23546000 -0.26979399 -0.12322000 -v -0.30087301 -0.33580801 -0.11045000 -v -0.29291499 -0.26019499 -0.11030800 -v -0.26898000 -0.10390100 -0.11294500 -v -0.22404701 -0.16349500 -0.14201500 -v -0.31849700 -0.14005899 -0.07469810 -v -0.27485099 -0.14685600 -0.11417100 -v -0.12311300 -0.20638800 -0.17004500 -v -0.17310600 -0.23047800 -0.14262800 -v -0.17201400 -0.14155100 -0.17000200 -v -0.17162099 -0.18499900 -0.16003700 -v -0.17638300 -0.34915000 -0.10631000 -v -0.11947800 -0.29577601 -0.11387200 -v -0.17453200 -0.28287700 -0.12153100 -v -0.27328101 0.04207330 -0.04384980 -v -0.23246200 0.00608204 -0.10682100 -v -0.26987800 -0.03188810 -0.09288380 -v -0.30780801 -0.00318692 -0.03170950 -v -0.27234200 0.00331308 -0.07240070 -v -0.14891499 0.00578811 -0.16536200 -v -0.18288299 -0.04570920 -0.15746900 -v -0.19905201 0.06236560 -0.10598900 -v -0.19065800 0.00742240 -0.13724101 -v -0.22280200 -0.07885040 -0.14150700 -v -0.13196400 -0.11113600 -0.18861300 -v -0.17621800 -0.09524390 -0.16876800 -v -0.30825600 -0.06314530 -0.06191020 -v -0.26804000 -0.06660210 -0.10612400 -v -0.26887000 -0.39635199 0.90975201 -v -0.21414100 -0.33468100 0.91990298 -v -0.26310501 -0.28922200 0.90057701 -v -0.30851001 -0.34008801 0.87540501 -v -0.26699501 -0.33692300 0.90429199 -v -0.10490400 -0.32848701 0.92278099 -v -0.16480100 -0.28420699 0.93026000 -v -0.14973301 -0.39340001 0.92033899 -v -0.15673000 -0.33263901 0.92412800 -v -0.17200300 -0.20263700 0.93974000 -v -0.21521600 -0.24472900 0.92060399 -v -0.12665600 -0.24041399 0.94502401 -v -0.16995500 -0.24235800 0.93533498 -v -0.29389799 -0.25263900 0.86713898 -v -0.25326201 -0.20921400 0.89788198 -v -0.25819501 -0.24830100 0.89848202 -v -0.37598699 -0.34081399 -0.03372680 -v -0.38090101 -0.27724299 0.03267100 -v -0.35845700 -0.20011200 -0.02671620 -v -0.36789501 -0.26385301 -0.03063430 -v -0.37559599 -0.31114501 0.17593899 -v -0.38225299 -0.23754200 0.10527700 -v -0.37917599 -0.36408600 0.10234300 -v -0.38139901 -0.29438901 0.10366500 -v -0.37902501 -0.14983600 0.11276400 -v -0.36960301 -0.16629100 0.04060570 -v -0.38518500 -0.21471199 0.17802501 -v -0.38088000 -0.19004600 0.10852800 -v -0.34262699 -0.10625700 -0.01566400 -v -0.34944400 -0.14808300 -0.02178780 -v -0.35140401 -0.35433099 0.42781401 -v -0.36796501 -0.30765101 0.37043101 -v -0.36372900 -0.33381701 0.30667400 -v -0.35769001 -0.34527600 0.36827999 -v -0.37618801 -0.22098000 0.37440601 -v -0.38007900 -0.25263599 0.30995300 -v -0.36655301 -0.27381200 0.43293601 -v -0.37362900 -0.26543301 0.37252700 -v -0.37952501 -0.27860901 0.24367900 -v -0.38639799 -0.19437400 0.24708401 -v -0.38442501 -0.23565200 0.24514300 -v -0.36970201 -0.32336399 0.24308400 -v -0.35914299 -0.04543760 0.38451701 -v -0.37622100 -0.08342010 0.31902501 -v -0.37537900 -0.13255900 0.37767401 -v -0.36353099 -0.09232410 0.44086701 -v -0.36975399 -0.08878610 0.38033101 -v -0.38007301 -0.06415950 0.19514100 -v -0.38599399 -0.11539700 0.25216901 -v -0.36932799 -0.03374850 0.26517901 -v -0.38047901 -0.07546490 0.25720900 -v -0.38363299 -0.16755600 0.31321400 -v -0.38642901 -0.13731200 0.18376200 -v -0.38744399 -0.15466200 0.24911000 -v -0.37014499 -0.18262100 0.43703800 -v -0.37714800 -0.17665599 0.37591100 -v -0.33848700 -0.04438260 0.00235778 -v -0.35796401 -0.03175110 0.07316550 -v -0.33101201 0.01716740 0.03897160 -v -0.33636600 -0.01572040 0.01752370 -v -0.36302301 -0.09190620 0.05247170 -v -0.33977401 -0.07312600 -0.00816016 -v -0.37698001 -0.08213290 0.12363400 -v -0.37843099 -0.11484800 0.11733100 -v -0.36302301 -0.01172890 0.14708200 -v -0.37255099 -0.04874280 0.13308300 -v -0.32472801 -0.29765999 0.82766998 -v -0.34091100 -0.35059801 0.77666003 -v -0.33684200 -0.40362000 0.83555198 -v -0.33190399 -0.34489799 0.83134902 -v -0.31171799 -0.21924300 0.82279402 -v -0.33154601 -0.26210499 0.77429497 -v -0.31732699 -0.25730801 0.82474297 -v -0.34460899 -0.27126899 0.66124600 -v -0.34067601 -0.30878100 0.71745300 -v -0.33868501 -0.22679800 0.72009200 -v -0.33961901 -0.26682600 0.71879601 -v -0.33593300 -0.41481301 0.71601403 -v -0.33471599 -0.36029801 0.65417600 -v -0.33926299 -0.35642800 0.71587199 -v -0.30429599 -0.05664420 0.81894201 -v -0.32815000 -0.09827740 0.77445298 -v -0.30975300 -0.13755700 0.82164198 -v -0.28298199 -0.09320740 0.86163002 -v -0.30906400 -0.09669120 0.82068998 -v -0.34985900 -0.09807430 0.67070103 -v -0.34226099 -0.14194401 0.72292000 -v -0.33509699 -0.05545190 0.72479498 -v -0.34137201 -0.09854540 0.72407198 -v -0.32806301 -0.18247400 0.77391201 -v -0.34889099 -0.18653899 0.66664499 -v -0.34046501 -0.18493199 0.72153002 -v -0.28425100 -0.17381300 0.86421102 -v -0.30991501 -0.17886700 0.82205200 -v -0.36419901 -0.14012399 0.49835199 -v -0.35760000 -0.09642600 0.55865002 -v -0.35088700 -0.05075590 0.50291097 -v -0.36000401 -0.09479510 0.50037402 -v -0.36305299 -0.23212899 0.49420401 -v -0.36008799 -0.18760900 0.55433798 -v -0.36477900 -0.18611200 0.49643299 -v -0.35668901 -0.14249000 0.61338300 -v -0.35205999 -0.23206399 0.60814399 -v -0.35511199 -0.18759100 0.61099499 -v -0.34722999 -0.05312970 0.61750901 -v -0.35474399 -0.09744340 0.61549199 -v -0.33880800 -0.35838100 0.54122901 -v -0.35481200 -0.32010901 0.48807901 -v -0.34468901 -0.35757601 0.48518899 -v -0.34484100 -0.31770900 0.60076302 -v -0.33502400 -0.36011899 0.59675902 -v -0.35474601 -0.27766901 0.54823500 -v -0.34957799 -0.27522999 0.60464603 -v -0.36033201 -0.27754399 0.49125099 -v -0.27002099 0.18379600 0.15140501 -v -0.25053501 0.21993500 0.20011200 -v -0.22988001 0.24754500 0.15782900 -v -0.25310400 0.20343500 0.11807800 -v -0.25109601 0.21767300 0.15894200 -v -0.24767201 0.20121500 0.28539401 -v -0.22434200 0.24855600 0.24901199 -v -0.27383700 0.17296900 0.23055699 -v -0.24932800 0.21376200 0.24224199 -v -0.16612200 0.29640001 0.25568199 -v -0.20102800 0.27979299 0.20460600 -v -0.19325000 0.26492801 0.29897401 -v -0.19717400 0.27641499 0.25283599 -v -0.20844500 0.25501600 0.09974860 -v -0.17393699 0.29579499 0.15179500 -v -0.20474200 0.27411699 0.15328600 -v -0.23893400 0.13709800 0.47295299 -v -0.21247999 0.17895600 0.42964399 -v -0.24364100 0.16610700 0.37536201 -v -0.26904699 0.11568900 0.41544700 -v -0.24135099 0.14938100 0.42300001 -v -0.14939301 0.22263700 0.43984300 -v -0.18552899 0.22449800 0.38908401 -v -0.17879900 0.18772300 0.48374999 -v -0.18197900 0.20363399 0.43528900 -v -0.21834099 0.21847700 0.33780500 -v -0.15750401 0.26654199 0.34870401 -v -0.18932700 0.24627601 0.34401801 -v -0.27281100 0.14512999 0.31905600 -v -0.24576201 0.18435800 0.32962999 -v -0.21201199 0.07558010 0.84120101 -v -0.18862601 0.11230800 0.82154799 -v -0.21770100 0.11212000 0.77552700 -v -0.23585600 0.07657990 0.80562103 -v -0.21332400 0.09652250 0.81185299 -v -0.13257000 0.13815901 0.83799201 -v -0.16396800 0.14839999 0.78970599 -v -0.15999900 0.09879760 0.86537302 -v -0.16169301 0.12627199 0.83030403 -v -0.16913800 0.17484701 0.69519299 -v -0.19501500 0.14622600 0.73819703 -v -0.13644201 0.17961900 0.75038701 -v -0.16654301 0.16473900 0.74439597 -v -0.24910800 0.09613730 0.72820699 -v -0.22681400 0.13029499 0.68449700 -v -0.22236700 0.12354000 0.73254800 -v -0.26440200 0.10196800 0.52039701 -v -0.23368600 0.13148600 0.57948703 -v -0.20704199 0.15853401 0.53077698 -v -0.23643300 0.13217600 0.52563399 -v -0.20159900 0.15716600 0.63790703 -v -0.25857499 0.10232300 0.62848699 -v -0.23053400 0.13190199 0.63295901 -v -0.13985801 0.19542100 0.64756900 -v -0.17373499 0.17896400 0.58917499 -v -0.17147300 0.17828400 0.64291501 -v -0.14353800 0.19875400 0.53980500 -v -0.17611501 0.18080600 0.53558201 -v -0.33783600 -0.00655256 0.44854900 -v -0.32092899 0.03898780 0.39863500 -v -0.34742001 0.00319315 0.33360201 -v -0.34241900 -0.00261151 0.39086699 -v -0.29874399 0.08941870 0.35544899 -v -0.29323199 0.07110380 0.46040499 -v -0.29602200 0.07865590 0.40707701 -v -0.30120999 0.11503400 0.25778300 -v -0.32742900 0.05668630 0.29107499 -v -0.30070299 0.10200700 0.30564401 -v -0.35121500 0.02042080 0.22141500 -v -0.35097399 0.01086830 0.27702701 -v -0.30898499 -0.01583640 0.77267897 -v -0.30028999 0.02661910 0.72505403 -v -0.32812199 -0.01123470 0.67360801 -v -0.32073799 -0.01337720 0.72489798 -v -0.26850900 -0.01842300 0.85448098 -v -0.27488801 0.01831980 0.81225699 -v -0.29189700 -0.01779180 0.81614202 -v -0.26734099 0.05736440 0.76982898 -v -0.24017000 0.04575360 0.83834600 -v -0.25629199 0.05014470 0.80725300 -v -0.28185901 0.06745340 0.67711002 -v -0.27574801 0.06347720 0.72593302 -v -0.23941800 0.10219500 -0.03510770 -v -0.21303500 0.17002200 -0.00953204 -v -0.18175299 0.13530301 -0.08485360 -v -0.20757000 0.11733500 -0.06161820 -v -0.29829201 0.07298210 0.02717660 -v -0.26527801 0.13337199 0.03535590 -v -0.27054101 0.08746450 -0.00640695 -v -0.23652300 0.19578101 0.06091390 -v -0.27658799 0.15557399 0.09810210 -v -0.25864801 0.17368200 0.07686660 -v -0.19029300 0.23705500 0.02589310 -v -0.21226799 0.21811600 0.04486640 -v -0.28887299 0.06784820 0.57055998 -v -0.31111300 0.03049050 0.62201601 -v -0.28601900 0.06826350 0.62490600 -v -0.31518501 0.03113880 0.51057398 -v -0.29106301 0.06814810 0.51531303 -v -0.33409899 -0.00961306 0.56363499 -v -0.33553699 -0.00863692 0.50637603 -v -0.33210200 -0.01022950 0.61961699 -v -0.32442299 0.07910820 0.18974499 -v -0.33594999 0.04472950 0.11548500 -v -0.34627700 0.03185760 0.16704001 -v -0.29539600 0.13744301 0.16910900 -v -0.29957300 0.12711500 0.21198700 -v -0.30518800 0.10308600 0.10041200 -v -0.28828600 0.14521199 0.12999800 -v -0.32002500 0.05858730 0.06833540 -v -0.17731400 0.20481800 -0.05101990 -v -0.16703400 0.18223000 -0.12279800 -v -0.14903399 0.11925500 -0.15276700 -v -0.16872500 0.15851900 -0.10372900 -v -0.15966500 0.28526700 0.04527830 -v -0.16742601 0.25901100 -0.02411110 -v -0.17500900 0.24896500 0.00116269 -v -0.17918000 0.29049700 -0.06097430 -v -0.17716400 0.23811200 -0.09338300 -v -0.14972100 0.30080000 -0.00470029 -v -0.16855700 0.27236000 -0.04471480 -v -0.16005801 0.16822900 -0.19583800 -v -0.19492100 0.22135700 -0.17301400 -v -0.17522800 0.20168100 -0.14661300 -v -0.21819000 0.28199500 -0.13355200 -v -0.26422000 0.27429301 -0.22820701 -v -0.23309800 0.21084000 -0.26730099 -v -0.22772500 0.24574199 -0.19983700 -v -0.17326300 0.34169301 -0.02383790 -v -0.22552100 0.34475699 -0.08450030 -v -0.20007300 0.31490800 -0.07321570 -v -0.26722199 0.41741401 -0.11644400 -v -0.27621999 0.34481400 -0.17678501 -v -0.21453001 0.40777501 -0.03170890 -v -0.24980900 0.37920401 -0.09788930 -v -0.30663800 0.26864100 -0.33816600 -v -0.31463900 0.34363899 -0.29252300 -v -0.29498500 0.30646899 -0.25924900 -v -0.27979699 0.20711701 -0.36698100 -v -0.24025100 0.15910999 -0.38764900 -v -0.19266599 0.15982901 -0.30860099 -v -0.23872600 0.18198299 -0.33117500 -v -0.33078599 0.26947001 -0.44548699 -v -0.30739900 0.20821300 -0.46355999 -v -0.31171000 0.23580401 -0.40641800 -v -0.25941199 0.16980000 -0.54272199 -v -0.26571500 0.16034199 -0.46921200 -v -0.30578700 0.21856301 -0.54744101 -v -0.29090101 0.18612599 -0.50914299 -v -0.19545101 0.12849700 -0.40737200 -v -0.21346100 0.12942000 -0.46510801 -v -0.23331100 0.14215800 -0.43291599 -v -0.32954100 0.34525600 -0.41095600 -v -0.32100800 0.35265499 -0.51141697 -v -0.32675001 0.28002700 -0.53593302 -v -0.33334500 0.30954200 -0.48018900 -v -0.25597599 0.42954901 -0.56362200 -v -0.28927800 0.35878599 -0.58491802 -v -0.29524499 0.43676201 -0.48418701 -v -0.29539901 0.39544299 -0.54006702 -v -0.24664500 0.31282699 -0.64033699 -v -0.29645601 0.29578599 -0.60246998 -v -0.24054800 0.35766000 -0.62796003 -v -0.27430499 0.33102599 -0.61749101 -v -0.27251601 0.23958200 -0.60953701 -v -0.30729499 0.25670701 -0.57883501 -v -0.28891200 -0.66627902 -0.08319810 -v -0.23366700 -0.71838301 -0.03946820 -v -0.28831300 -0.71952999 0.02920020 -v -0.33504701 -0.66746998 -0.02619400 -v -0.28852299 -0.70492703 -0.03299010 -v -0.13655201 -0.67510998 -0.02800420 -v -0.17279600 -0.72359401 0.02471690 -v -0.18744300 -0.66969800 -0.08188190 -v -0.17963301 -0.70823300 -0.03502670 -v -0.18276601 -0.68731201 0.13576700 -v -0.22744200 -0.72474098 0.09338520 -v -0.13663100 -0.68612099 0.07876340 -v -0.17619100 -0.71615100 0.08578640 -v -0.32704401 -0.67406601 0.08728250 -v -0.27615201 -0.67947698 0.14116000 -v -0.28116101 -0.71070403 0.09107580 -v -0.28821701 -0.67943501 0.83837903 -v -0.24864200 -0.72451901 0.79089499 -v -0.19889601 -0.72333503 0.85193002 -v -0.24609999 -0.67820501 0.88950801 -v -0.24683100 -0.71191198 0.84543198 -v -0.24088000 -0.68868202 0.69162798 -v -0.19840799 -0.72853202 0.73459101 -v -0.28358701 -0.68451500 0.73878503 -v -0.24443400 -0.71648300 0.73635799 -v -0.11585900 -0.69348300 0.74811500 -v -0.14866100 -0.72734702 0.79562598 -v -0.15797600 -0.69471300 0.69698602 -v -0.15304700 -0.72055501 0.74140102 -v -0.15573999 -0.68000400 0.89212102 -v -0.11303300 -0.68417102 0.84496498 -v -0.15182900 -0.71393198 0.84914601 -v -0.30390999 -0.49806601 0.66895598 -v -0.32282001 -0.56595200 0.72619802 -v -0.34248900 -0.48341900 0.78140998 -v -0.33123699 -0.48898301 0.71983600 -v -0.31973201 -0.63345402 0.78642797 -v -0.28283000 -0.63256299 0.69100899 -v -0.30832601 -0.63273400 0.73395598 -v -0.29419699 -0.61897397 0.88446897 -v -0.33133101 -0.55665898 0.84223598 -v -0.31563899 -0.62567300 0.83949602 -v -0.31354001 -0.47457701 0.88789499 -v -0.33752400 -0.47842500 0.84005100 -v -0.09691940 -0.47877800 0.89749497 -v -0.07747190 -0.57017303 0.85132998 -v -0.06545670 -0.51587802 0.79543000 -v -0.06347110 -0.43176499 0.85189903 -v -0.07072340 -0.49632099 0.85239202 -v -0.08404440 -0.64607000 0.79711801 -v -0.11280500 -0.62408799 0.88898599 -v -0.08991110 -0.63452101 0.84727401 -v -0.11906300 -0.64767897 0.70201200 -v -0.08326550 -0.59114403 0.74008697 -v -0.09434750 -0.64824897 0.74605799 -v -0.06995600 -0.47422001 0.73529202 -v -0.10668400 -0.53463602 0.68287402 -v -0.07736610 -0.52845901 0.73505598 -v -0.20828700 -0.52835000 0.63722301 -v -0.25237101 -0.58183300 0.65283197 -v -0.26065099 -0.51361799 0.64239800 -v -0.15335000 -0.59564400 0.66033000 -v -0.15364499 -0.53497797 0.65048897 -v -0.20034000 -0.65135598 0.66047502 -v -0.15643600 -0.65098298 0.67289603 -v -0.24465300 -0.64199400 0.66651398 -v -0.20939200 -0.47176999 0.92831397 -v -0.14954300 -0.55442899 0.92281199 -v -0.14779800 -0.47223601 0.92229402 -v -0.26286799 -0.55229598 0.92010802 -v -0.26773399 -0.47245499 0.91708201 -v -0.20343600 -0.62816900 0.92307103 -v -0.25355101 -0.62293899 0.91265798 -v -0.15358400 -0.62526101 0.91471601 -v -0.38743600 -0.44032100 0.02966820 -v -0.36953700 -0.53841901 0.09612110 -v -0.34856099 -0.46405399 0.15871599 -v -0.37644401 -0.45012999 0.09995990 -v -0.35444501 -0.42785099 -0.08781250 -v -0.37845501 -0.52530801 -0.03562010 -v -0.38096401 -0.43250400 -0.03617870 -v -0.36823601 -0.61497599 0.03062670 -v -0.34074199 -0.59789902 -0.07982290 -v -0.36408699 -0.60561401 -0.02968130 -v -0.32555801 -0.61542302 0.13959201 -v -0.35478601 -0.61485100 0.09042980 -v -0.12704000 -0.44809899 -0.07357850 -v -0.18270101 -0.52784598 -0.10993700 -v -0.24351799 -0.43064201 -0.12106200 -v -0.17913900 -0.43624800 -0.10652800 -v -0.24192300 -0.60985899 -0.11735900 -v -0.14131600 -0.60721701 -0.07303720 -v -0.18696700 -0.60761499 -0.10428700 -v -0.30444300 -0.52128702 -0.11760600 -v -0.29660100 -0.60296702 -0.10912700 -v -0.30529100 -0.42753699 -0.11546500 -v -0.25113001 -0.50274497 0.19709399 -v -0.18853600 -0.57739401 0.17493400 -v -0.14811499 -0.51256299 0.14992900 -v -0.19617701 -0.51176900 0.18354601 -v -0.29378399 -0.55956799 0.18106300 -v -0.30435699 -0.48421600 0.18995599 -v -0.23306400 -0.63822597 0.17554300 -v -0.28237101 -0.62687701 0.16797701 -v -0.14523700 -0.63517803 0.13052000 -v -0.18547399 -0.63848400 0.16224501 -v -0.09537010 -0.40561101 -0.02147820 -v -0.09979460 -0.49246800 0.03527120 -v -0.10571200 -0.54889500 -0.02684320 -v -0.10210700 -0.46993601 -0.02392750 -v -0.11328800 -0.57327300 0.09109930 -v -0.11251500 -0.45191899 0.09356880 -v -0.11555900 -0.50640398 0.09686390 -v -0.10675100 -0.63310802 0.02755670 -v -0.11798800 -0.63583702 0.08280000 -v -0.11455200 -0.61964101 -0.02673920 -v -0.30865800 0.43336001 -0.36830500 -v -0.28535300 0.52085298 -0.36155099 -v -0.27118400 0.52575898 -0.46007901 -v -0.29139099 0.47850701 -0.41852701 -v -0.29850900 0.42752200 -0.23628201 -v -0.31780201 0.38716999 -0.32758999 -v -0.23533501 0.48553100 -0.06476150 -v -0.27121401 0.49806699 -0.16797701 -v -0.27204499 0.45855001 -0.14322500 -v -0.27787501 0.55689001 -0.19096500 -v -0.28257701 0.53588301 -0.25968099 -v -0.24700800 0.54474002 -0.11411400 -v -0.27166501 0.53142500 -0.18044600 -v -0.26699999 0.60193098 -0.38818499 -v -0.27805501 0.60076499 -0.32010800 -v -0.27864501 0.56397599 -0.33171999 -v -0.25236300 0.68216699 -0.15033001 -v -0.32645199 0.64530897 -0.13850400 -v -0.26767901 0.61028397 -0.12954900 -v -0.19262600 0.64757597 -0.12577400 -v -0.25811601 0.64545101 -0.13607000 -v -0.43034899 0.65827698 -0.15438201 -v -0.38032100 0.61857003 -0.15241300 -v -0.38868201 0.68040597 -0.14489301 -v -0.38479200 0.64790797 -0.14370400 -v -0.35448000 0.58921301 -0.20256400 -v -0.32434601 0.58771402 -0.15672000 -v -0.40158299 0.61271602 -0.19176000 -v -0.36784199 0.59746701 -0.17194000 -v -0.23908199 0.57895702 -0.11199600 -v -0.28947100 0.56907398 -0.16246900 -v -0.27936101 0.58320802 -0.13702200 -v -0.31835899 0.58466601 -0.23009400 -v -0.29443899 0.59184903 -0.26603901 -v -0.29431799 0.57272899 -0.20987099 -v -0.38059101 0.61458200 -0.24553500 -v -0.34396699 0.62006801 -0.28688699 -v -0.34736300 0.59842497 -0.24456500 -v -0.34507900 0.68132699 -0.33315599 -v -0.31260601 0.63866800 -0.31912401 -v -0.37588099 0.66250497 -0.31082100 -v -0.34176999 0.64910698 -0.31847700 -v -0.28588000 0.66204900 -0.34908900 -v -0.29037201 0.62410802 -0.31778800 -v -0.41957200 0.65870601 -0.26189199 -v -0.44419700 0.71139401 -0.26325601 -v -0.39374301 0.70676500 -0.31230000 -v -0.41295800 0.68594301 -0.29112801 -v -0.44728899 0.65595597 -0.19680300 -v -0.41730300 0.63371301 -0.22525600 -v -0.44739699 0.70239198 -0.15815000 -v -0.47155201 0.70857900 -0.19918400 -v -0.46033701 0.68144798 -0.17325000 -v -0.43241000 0.74645501 -0.25830299 -v -0.45258901 0.74444401 -0.20681600 -v -0.46079201 0.73083103 -0.23106299 -v -0.04673820 0.32528400 0.13673900 -v -0.09255390 0.32013899 0.17069900 -v -0.04624360 0.32016400 0.22133701 -v -0.04689910 0.32370701 0.17766000 -v -0.13293600 0.31206101 0.21048500 -v -0.13529900 0.30831999 0.11259800 -v -0.13572000 0.31098601 0.15983801 -v -0.12562799 0.29656401 0.30682901 -v -0.08864910 0.31239599 0.26343501 -v -0.12948100 0.30757499 0.25951901 -v -0.04348920 0.30184999 0.31193399 -v -0.04502310 0.31332299 0.26651499 -v -0.03778270 0.23206501 0.49518800 -v -0.07353270 0.22129300 0.54570597 -v -0.03645170 0.22520000 0.60147899 -v -0.03698680 0.22652601 0.54725999 -v -0.10765100 0.21008600 0.59707898 -v -0.11132500 0.21911100 0.49138901 -v -0.10919700 0.21214300 0.54320103 -v -0.10538400 0.20391700 0.70475501 -v -0.07171530 0.21825500 0.65442002 -v -0.10645600 0.20874301 0.65145397 -v -0.03577810 0.21867900 0.71024901 -v -0.03608090 0.22396000 0.65631902 -v -0.07035920 0.19998699 0.75926501 -v -0.03503300 0.18494000 0.80962300 -v -0.03544690 0.20523199 0.76174200 -v -0.10286000 0.17231099 0.80234700 -v -0.10420200 0.19140901 0.75541198 -v -0.09948050 0.11870500 0.88073701 -v -0.06842860 0.15476100 0.84948599 -v -0.10130300 0.14771301 0.84448099 -v -0.03374030 0.12911899 0.88985199 -v -0.03448220 0.15912800 0.85271800 -v -0.03254400 -0.43333599 0.06844560 -v -0.06198550 -0.41945401 0.05164050 -v -0.02900270 -0.40133601 0.00260959 -v -0.03121420 -0.42003599 0.03584000 -v -0.08043860 -0.40757701 0.02501200 -v -0.10198100 -0.43742001 0.11887300 -v -0.09187120 -0.42650899 0.07468890 -v -0.07813920 -0.34340200 -0.06802910 -v -0.05249890 -0.37448600 -0.02686580 -v -0.07713270 -0.37876499 -0.02298100 -v -0.02458700 -0.35025501 -0.06699270 -v -0.02657260 -0.37786600 -0.03156240 -v -0.01734990 -0.34089699 0.89134800 -v -0.03251800 -0.37795499 0.85121697 -v -0.01621420 -0.39685801 0.80846900 -v -0.01611030 -0.37073299 0.85231900 -v -0.04736930 -0.42307901 0.79981500 -v -0.05769740 -0.36046901 0.89382201 -v -0.04952040 -0.39530399 0.85129201 -v -0.06414990 -0.45469299 0.69653797 -v -0.03522630 -0.42631099 0.75720203 -v -0.05434170 -0.44244999 0.74512202 -v -0.01905710 -0.43673500 0.72386903 -v -0.01731270 -0.41896200 0.76418900 -v -0.08278000 0.28322300 0.35483801 -v -0.04034070 0.26458400 0.40090001 -v -0.04189350 0.28441101 0.35633799 -v -0.11778700 0.25622001 0.39730799 -v -0.12165200 0.27806199 0.35230201 -v -0.07723610 0.24253701 0.44549799 -v -0.11426700 0.23518600 0.44321400 -v -0.03893550 0.24594299 0.44679201 -v -0.04486640 0.35103601 0.03689170 -v -0.08477700 0.33113399 0.03926020 -v -0.04415740 0.32911900 0.06931120 -v -0.04362810 0.33652899 0.04754100 -v -0.12257900 0.31142899 0.04368310 -v -0.12556900 0.33518001 0.01101010 -v -0.12096800 0.31980699 0.02256890 -v -0.08917090 0.32058299 0.09065030 -v -0.12913699 0.30803400 0.07378640 -v -0.04550920 0.32622901 0.09983350 -v -0.06322840 0.49669299 0.05228520 -v -0.11650300 0.44225600 0.03993080 -v -0.05410980 0.40816000 0.04837140 -v -0.05937080 0.44895500 0.05511930 -v -0.15343800 0.39127699 0.01214460 -v -0.18104000 0.47003901 0.00485434 -v -0.16915900 0.42866001 0.01260960 -v -0.09543460 0.37017900 0.02982700 -v -0.13765000 0.35956001 0.00957340 -v -0.04881770 0.37521699 0.03973200 -v -0.06927610 0.50558197 -0.56204200 -v -0.13013600 0.56800401 -0.52876401 -v -0.06264850 0.64018899 -0.50604600 -v -0.06647380 0.57021600 -0.53352499 -v -0.23204701 0.56521600 -0.50191802 -v -0.17402500 0.63237703 -0.49522299 -v -0.19918700 0.49891999 -0.54566801 -v -0.18817300 0.56406599 -0.51907003 -v -0.15053301 0.74404299 -0.44196001 -v -0.11320100 0.70172602 -0.47450501 -v -0.19990499 0.68549699 -0.46249601 -v -0.16161400 0.69417500 -0.46957600 -v -0.05367940 0.76236802 -0.44766399 -v -0.05823790 0.70705497 -0.47797099 -v -0.07269580 0.34095699 -0.66479897 -v -0.13828200 0.37568101 -0.64542401 -v -0.07118110 0.41327500 -0.62329203 -v -0.07164650 0.37681499 -0.64841598 -v -0.19987300 0.40474799 -0.61293501 -v -0.19363400 0.33949900 -0.65286601 -v -0.19489500 0.37092099 -0.63793802 -v -0.13882101 0.45291701 -0.58905399 -v -0.20219500 0.44661400 -0.57956702 -v -0.07061810 0.45473301 -0.59323299 -v -0.03063990 -0.19572800 0.97028500 -v -0.05712300 -0.23592199 0.95662099 -v -0.02404680 -0.27183500 0.94326401 -v -0.02778580 -0.23425201 0.95913899 -v -0.08027690 -0.27776399 0.93951499 -v -0.09568030 -0.19945499 0.96067601 -v -0.08956270 -0.23812200 0.95201802 -v -0.04255270 -0.31146300 0.92105299 -v -0.06880230 -0.31991801 0.92167401 -v -0.02028170 -0.30765700 0.92116499 -v -0.04954700 -0.31195599 -0.10581700 -v -0.02383670 -0.28310299 -0.13984300 -v -0.02370900 -0.31913400 -0.10399800 -v -0.08162430 -0.26418900 -0.14448500 -v -0.07964330 -0.30481899 -0.10887100 -v -0.08780740 -0.17651300 -0.19394100 -v -0.05210080 -0.23408000 -0.17368300 -v -0.08406110 -0.22268499 -0.17384700 -v -0.02670240 -0.19071800 -0.19711100 -v -0.02486840 -0.24076501 -0.17179200 -v -0.05997510 -0.12838800 -0.20946699 -v -0.03218710 -0.06915960 -0.22273099 -v -0.02923670 -0.13156500 -0.21306400 -v -0.10108700 -0.06207190 -0.20036399 -v -0.09371690 -0.12188200 -0.20174800 -v -0.11567400 0.05510500 -0.18788300 -v -0.07139020 -0.00682142 -0.21557200 -v -0.10921600 -0.00036684 -0.19288400 -v -0.03819810 0.04199610 -0.23552600 -v -0.03526900 -0.00935459 -0.22919200 -v -0.08037110 0.08445670 -0.22527100 -v -0.04289260 0.10338600 -0.25797701 -v -0.04069010 0.07903880 -0.24481399 -v -0.12092200 0.12485500 -0.20936300 -v -0.11803400 0.09621500 -0.19393501 -v -0.13847800 0.14859501 -0.26506901 -v -0.08843310 0.12572999 -0.25853300 -v -0.12896401 0.14291801 -0.23248801 -v -0.04702120 0.12044300 -0.29962599 -v -0.04495370 0.11665000 -0.27594000 -v -0.09799900 0.12487800 -0.31997600 -v -0.05189470 0.10885300 -0.36575300 -v -0.04924290 0.11637700 -0.32995600 -v -0.15091100 0.12632200 -0.35627100 -v -0.14578199 0.14007799 -0.30886301 -v -0.16045000 0.11291500 -0.44107899 -v -0.10754100 0.10703100 -0.40186101 -v -0.15390100 0.11628100 -0.39969701 -v -0.05959190 0.10102400 -0.44902599 -v -0.05525250 0.10226800 -0.40583599 -v -0.12555100 0.11227900 -0.49019599 -v -0.07099820 0.12670900 -0.53864199 -v -0.06518900 0.10952000 -0.49414301 -v -0.19494399 0.13480601 -0.52334601 -v -0.17625800 0.11918600 -0.48235899 -v -0.21930100 0.19138700 -0.60018897 -v -0.14749999 0.15385400 -0.57533199 -v -0.21012899 0.15949000 -0.56384999 -v -0.07907180 0.18298800 -0.61559898 -v -0.07597430 0.15154700 -0.57997602 -v -0.15404400 0.22256400 -0.63894099 -v -0.07754250 0.26020601 -0.66100198 -v -0.07924550 0.21998700 -0.64296502 -v -0.21377200 0.26767001 -0.64780301 -v -0.21995001 0.22864801 -0.62868500 -v -0.14437801 0.30253401 -0.66520798 -v -0.20246300 0.30485100 -0.65600902 -v -0.07501020 0.30130899 -0.66863698 -v -0.06068840 0.60785002 0.00104436 -v -0.12671500 0.53733701 0.01114680 -v -0.06431070 0.55046302 0.03217850 -v -0.04035170 0.71829998 -0.07190160 -v -0.09874660 0.65678602 -0.06244700 -v -0.05043260 0.66644198 -0.03487200 -v -0.17116500 0.60579902 -0.07642890 -v -0.12609600 0.69556999 -0.12707099 -v -0.14282399 0.65092599 -0.09699060 -v -0.19163699 0.55023301 -0.04775240 -v -0.20970100 0.56996799 -0.08078950 -v -0.18530799 0.51374298 -0.01723540 -v -0.25851399 0.60219699 -0.44519901 -v -0.23761401 0.63046801 -0.46987301 -v -0.25321701 0.57826900 -0.47478300 -v -0.24652900 0.67247999 -0.39795199 -v -0.24094300 0.66222399 -0.43893999 -v -0.25477099 0.63597602 -0.42070001 -v -0.21289600 0.71490502 -0.42843500 -v -0.22450100 0.67678899 -0.45257801 -v -0.21422400 0.91667199 -0.24604601 -v -0.20101400 0.94333798 -0.25145000 -v -0.21544001 0.93868101 -0.27942300 -v -0.22643600 0.91272300 -0.26973000 -v -0.21696500 0.93182498 -0.26116699 -v -0.15985601 0.93968600 -0.23965099 -v -0.17745000 0.95364600 -0.26040500 -v -0.17980100 0.93094498 -0.23207000 -v -0.18078300 0.94641101 -0.24463500 -v -0.16591200 0.93930298 -0.29273900 -v -0.19187599 0.94898897 -0.28837800 -v -0.15369999 0.94325203 -0.26905400 -v -0.17310899 0.95103502 -0.27783501 -v -0.21686199 0.91893601 -0.30396500 -v -0.19691700 0.92767602 -0.31154600 -v -0.20763400 0.93773198 -0.29671001 -v -0.20999600 0.76187599 -0.26835799 -v -0.19908400 0.77337003 -0.28140500 -v -0.19143800 0.77473402 -0.31202200 -v -0.20781399 0.75986898 -0.30298999 -v -0.20173401 0.76712698 -0.28955001 -v -0.20323300 0.79747200 -0.27393201 -v -0.19238700 0.78909200 -0.30184200 -v -0.20217501 0.77548200 -0.25199699 -v -0.19922100 0.78193003 -0.27640000 -v -0.16581900 0.80441803 -0.33528799 -v -0.17822100 0.78837401 -0.32557499 -v -0.18742000 0.81174302 -0.32153201 -v -0.18106800 0.79666799 -0.32284400 -v -0.18095601 0.77960002 -0.34143999 -v -0.16174300 0.79314101 -0.34275800 -v -0.17835701 0.78372800 -0.33126199 -v -0.19251600 0.77793801 -0.22775900 -v -0.16850300 0.78144699 -0.21054100 -v -0.15141501 0.80164802 -0.21548200 -v -0.18133600 0.80431700 -0.22860600 -v -0.17426801 0.78915602 -0.22056501 -v -0.15363801 0.77253902 -0.19137600 -v -0.13743401 0.78917599 -0.20042001 -v -0.18617500 0.76688200 -0.20473900 -v -0.16229200 0.77673697 -0.20086101 -v -0.09630230 0.81256300 -0.21585000 -v -0.12229000 0.80530900 -0.21138600 -v -0.10307100 0.80025703 -0.19801299 -v -0.11477300 0.80181599 -0.20559201 -v -0.13532700 0.82857198 -0.21789400 -v -0.10834500 0.82291901 -0.22107500 -v -0.12826200 0.81335503 -0.21546400 -v -0.14332899 0.80462700 -0.33725199 -v -0.11915900 0.80980402 -0.33135101 -v -0.13845000 0.80167699 -0.35068500 -v -0.14084400 0.80200201 -0.34199801 -v -0.15371300 0.82696599 -0.33402401 -v -0.12769599 0.81920600 -0.32520199 -v -0.14719100 0.81209999 -0.33505601 -v -0.09615670 0.82966602 -0.28883499 -v -0.10501000 0.81788200 -0.31015700 -v -0.11661400 0.84024799 -0.30805099 -v -0.10984800 0.82523102 -0.30877700 -v -0.09345540 0.81754899 -0.31885299 -v -0.08600300 0.82045799 -0.29130399 -v -0.10018500 0.81604201 -0.31318501 -v -0.08405400 0.82463801 -0.26886401 -v -0.07809190 0.82257599 -0.24892800 -v -0.07101790 0.82433498 -0.27068201 -v -0.07869610 0.82279497 -0.26951301 -v -0.09598180 0.84702802 -0.26789799 -v -0.08880810 0.83189201 -0.24922299 -v -0.08913480 0.83200300 -0.26842901 -v -0.08994790 0.82157499 -0.23211500 -v -0.10202900 0.84389198 -0.23298900 -v -0.09520300 0.82898098 -0.23288301 -v -0.07516750 0.81987900 -0.22852901 -v -0.08401800 0.81932402 -0.23066799 -v -0.23190200 0.75422299 -0.26947001 -v -0.22607499 0.75999397 -0.24085800 -v -0.20807600 0.76441503 -0.24178900 -v -0.21697199 0.75995201 -0.25295600 -v -0.26510301 0.76085198 -0.22018901 -v -0.22344400 0.76045102 -0.21768899 -v -0.26414400 0.76081598 -0.24392299 -v -0.24071400 0.76064098 -0.22957601 -v -0.20189001 0.76557398 -0.22074001 -v -0.21575899 0.75767303 -0.20046200 -v -0.20591199 0.76199198 -0.20987900 -v -0.20185401 0.77005100 -0.23411199 -v -0.23487200 0.74279898 -0.30628601 -v -0.27785799 0.72749799 -0.31952301 -v -0.27899501 0.75125498 -0.27923799 -v -0.25622401 0.74478602 -0.29318401 -v -0.31798601 0.70804697 -0.33357701 -v -0.25823599 0.69355202 -0.35688299 -v -0.28472599 0.69821602 -0.34391299 -v -0.37536001 0.73814797 -0.30116001 -v -0.35820499 0.71251500 -0.32474500 -v -0.40268499 0.75864297 -0.23620100 -v -0.34396499 0.75661701 -0.26972100 -v -0.39075801 0.75370502 -0.27032000 -v -0.31116700 0.76368499 -0.23617300 -v -0.30016100 0.75923097 -0.25911301 -v -0.27737600 0.75325102 -0.19712600 -v -0.24865100 0.73777300 -0.18065999 -v -0.18352900 0.75471401 -0.18893500 -v -0.23327000 0.75098401 -0.19142200 -v -0.35261700 0.75679600 -0.20856500 -v -0.30345601 0.75958800 -0.21377601 -v -0.40900299 0.73616701 -0.17431401 -v -0.40942901 0.75242400 -0.20278101 -v -0.32984501 0.71293199 -0.15926801 -v -0.39941999 0.71099401 -0.15505700 -v -0.17877901 0.71813500 -0.16643000 -v -0.25211200 0.71388698 -0.16607800 -v -0.10674100 0.78208202 -0.17896900 -v -0.06026610 0.79742497 -0.17779700 -v -0.07050060 0.81175297 -0.20580700 -v -0.08454510 0.79801500 -0.18858100 -v -0.12835200 0.75367999 -0.16956000 -v -0.14054400 0.76636398 -0.18193600 -v -0.07716880 0.74413401 -0.12858200 -v -0.12240400 0.72995102 -0.15126599 -v -0.03596380 0.78174502 -0.13792001 -v -0.03725420 0.75548601 -0.10637600 -v -0.02587440 0.81445599 -0.19275001 -v -0.03130390 0.80082399 -0.16616000 -v -0.04380170 0.81809801 -0.37741199 -v -0.06475640 0.82400799 -0.33702099 -v -0.02698070 0.83276302 -0.30695599 -v -0.03522380 0.82871902 -0.34138700 -v -0.09685680 0.78937602 -0.41177201 -v -0.04941050 0.79768097 -0.41349101 -v -0.17651300 0.76051497 -0.41065499 -v -0.13414800 0.79462701 -0.38492000 -v -0.14037500 0.77656603 -0.41220701 -v -0.10544600 0.81232399 -0.35213101 -v -0.16394800 0.78761297 -0.36637199 -v -0.13486201 0.80110800 -0.36470199 -v -0.06737290 0.82510000 -0.29944599 -v -0.08290650 0.82024503 -0.32815400 -v -0.02095850 0.83068001 -0.24671701 -v -0.04313160 0.82238102 -0.22249800 -v -0.02227520 0.82437903 -0.21934099 -v -0.04271430 0.83040601 -0.27463099 -v -0.02237630 0.83344501 -0.27566099 -v -0.05710550 0.82586402 -0.24803400 -v -0.05897610 0.82712102 -0.27268001 -v -0.06115060 0.82088900 -0.22568400 -v -0.22089300 0.72350299 -0.39026499 -v -0.19233300 0.76123601 -0.37858400 -v -0.20182000 0.74248701 -0.40297601 -v -0.22914700 0.73045999 -0.34861901 -v -0.23832799 0.70458603 -0.37361699 -v -0.20250300 0.75901300 -0.34223801 -v -0.21796399 0.74826801 -0.32387799 -v -0.18549700 0.77285498 -0.35764301 -v -0.20815399 0.83004200 -0.29894799 -v -0.20855001 0.86608899 -0.31715700 -v -0.18263800 0.84416300 -0.33275101 -v -0.19779600 0.83673102 -0.32010600 -v -0.20747299 0.82397902 -0.24925900 -v -0.22169000 0.85672402 -0.27353600 -v -0.21220900 0.82466203 -0.27339801 -v -0.22543500 0.89132398 -0.29361200 -v -0.22171301 0.88575298 -0.25337401 -v -0.22722200 0.88688397 -0.27308300 -v -0.20208800 0.89860898 -0.32218999 -v -0.21603601 0.89427298 -0.31127900 -v -0.14488900 0.85895002 -0.32316700 -v -0.14018799 0.89349502 -0.30485401 -v -0.11365400 0.86959702 -0.28724399 -v -0.12722500 0.86509401 -0.30698600 -v -0.17602000 0.88051999 -0.32949901 -v -0.16418099 0.85177201 -0.33276400 -v -0.17040700 0.91557401 -0.31453699 -v -0.18665500 0.90721399 -0.32245100 -v -0.14127800 0.92125100 -0.28396401 -v -0.15401100 0.91917700 -0.30092499 -v -0.10627800 0.87162000 -0.24805900 -v -0.12623499 0.89679199 -0.23275700 -v -0.12592100 0.86272401 -0.22203700 -v -0.11267200 0.86865801 -0.23244600 -v -0.12026400 0.90000701 -0.26615700 -v -0.10663800 0.87185198 -0.26696301 -v -0.13670599 0.92653197 -0.24913400 -v -0.13601799 0.92502499 -0.26600701 -v -0.15282500 0.91465199 -0.22656800 -v -0.14181800 0.92180699 -0.23542500 -v -0.16929699 0.84265298 -0.22227800 -v -0.20172501 0.86322701 -0.23457800 -v -0.19145800 0.83138102 -0.23233400 -v -0.15872400 0.88235098 -0.22015500 -v -0.14612401 0.85357898 -0.21874700 -v -0.19173500 0.90228200 -0.22820900 -v -0.17119899 0.90886599 -0.22425300 -v -0.20922901 0.89273101 -0.23816600 -v -0.22836500 -0.44618100 0.42097700 -v -0.20511000 -0.46183699 0.47550201 -v -0.18364100 -0.45548901 0.53437901 -v -0.21325999 -0.45030299 0.47853899 -v -0.17688100 -0.48852000 0.46999100 -v -0.17086001 -0.47463101 0.52178901 -v -0.20666300 -0.47250500 0.41862601 -v -0.19497500 -0.47463101 0.47242799 -v -0.10955200 -0.47205701 0.59548497 -v -0.14255901 -0.46666899 0.57468998 -v -0.13203301 -0.48116699 0.55678099 -v -0.14084899 -0.47345799 0.56331599 -v -0.10298100 -0.46572301 0.63297403 -v -0.14378700 -0.46224299 0.58791399 -v -0.07558920 -0.46538699 0.63901800 -v -0.04399950 -0.45392901 0.68206298 -v -0.07050610 -0.46108299 0.66338903 -v -0.09177580 -0.47903401 0.59150499 -v -0.05493510 -0.47109100 0.62964201 -v -0.08157810 -0.47137499 0.61677098 -v -0.02382680 -0.46053001 0.66417098 -v -0.03290530 -0.48309401 0.60496801 -v -0.02763240 -0.47088301 0.63656503 -v -0.02109840 -0.44986999 0.69190103 -v -0.03176460 -0.44535199 0.13427600 -v -0.06574100 -0.44011101 0.11972600 -v -0.03232910 -0.44060600 0.10074300 -v -0.03436800 -0.46129599 0.21122900 -v -0.06361230 -0.45002800 0.18216100 -v -0.03204580 -0.45107999 0.17059000 -v -0.12410200 -0.45071900 0.22868399 -v -0.09651980 -0.44483399 0.17566200 -v -0.09812780 -0.45727900 0.23067699 -v -0.09422010 -0.44950101 0.20111801 -v -0.13801500 -0.44389501 0.19228099 -v -0.10131900 -0.44216701 0.15038900 -v -0.16353600 -0.44768500 0.25595900 -v -0.20566100 -0.44092301 0.30331001 -v -0.17478500 -0.44241399 0.24495000 -v -0.13838500 -0.46258301 0.27146500 -v -0.17953700 -0.46082601 0.31165999 -v -0.15349101 -0.45489699 0.26608101 -v -0.21309499 -0.45442501 0.36305001 -v -0.17834400 -0.48112300 0.36405200 -v -0.19938900 -0.46730000 0.36377200 -v -0.22467700 -0.44261599 0.36227700 -v -0.07741590 -0.49456000 0.56247997 -v -0.04728840 -0.51530099 0.51927400 -v -0.04003560 -0.49932900 0.56526798 -v -0.12906000 -0.49717501 0.51701897 -v -0.10948500 -0.48835400 0.55807698 -v -0.15177600 -0.50386500 0.41666499 -v -0.10237400 -0.51682699 0.46860501 -v -0.14485300 -0.50333798 0.46885899 -v -0.05522190 -0.52932101 0.41564399 -v -0.05292880 -0.52672702 0.46879601 -v -0.10172700 -0.50906599 0.36254600 -v -0.04664100 -0.50043201 0.30843100 -v -0.05243280 -0.51879603 0.36162800 -v -0.12954000 -0.48295301 0.31286201 -v -0.14474300 -0.49577701 0.36349899 -v -0.07789560 -0.47493100 0.26187500 -v -0.11195100 -0.46927500 0.26825699 -v -0.03992620 -0.47950599 0.25773701 -v -0.16463099 -0.05044890 0.95117599 -v -0.13904200 -0.04516330 0.96365899 -v -0.13789700 -0.02982650 0.96106100 -v -0.16267000 -0.02974630 0.94759703 -v -0.15000699 -0.03816100 0.95703399 -v -0.10985100 -0.05167940 0.97628301 -v -0.12246200 -0.03791400 0.96996301 -v -0.13371401 -0.06424990 0.96541601 -v -0.12524500 -0.04877810 0.96961898 -v -0.13096800 -0.01354590 0.95685101 -v -0.10933100 -0.03044080 0.97429299 -v -0.12417200 -0.02738950 0.96625900 -v -0.18873000 -0.04347480 0.93576401 -v -0.21391800 -0.07802200 0.92284101 -v -0.17278200 -0.08126710 0.94765103 -v -0.18590300 -0.06474600 0.94048601 -v -0.24743000 -0.12519400 0.89874500 -v -0.24751700 -0.05165720 0.89181501 -v -0.24877200 -0.08724670 0.89611799 -v -0.20986700 -0.16157299 0.92524397 -v -0.24930000 -0.16701400 0.89865100 -v -0.13300100 -0.16112401 0.95695603 -v -0.16388200 -0.12098900 0.94927102 -v -0.17075400 -0.16059101 0.94386101 -v -0.11975800 -0.09111090 0.96806699 -v -0.14906500 -0.08859750 0.95754498 -v -0.16595300 -0.00373407 0.93417901 -v -0.20664100 -0.01686250 0.91318297 -v -0.18156300 -0.02189410 0.93320000 -v -0.11669800 0.01460290 0.94810200 -v -0.15503700 0.03421590 0.91836500 -v -0.14344700 0.00727528 0.94008499 -v -0.18850800 0.05557700 0.88186097 -v -0.12871300 0.07767570 0.90259999 -v -0.15916701 0.06641780 0.89409399 -v -0.22559699 0.01651320 0.87835401 -v -0.21654201 0.04812670 0.86324698 -v -0.23785700 -0.01690930 0.88688499 -v -0.03141290 0.06261800 0.94454902 -v -0.05910530 0.02739470 0.96148002 -v -0.02724410 0.00174637 0.98536801 -v -0.02961240 0.03040810 0.96577698 -v -0.06527620 0.09255390 0.91593999 -v -0.03275300 0.09623530 0.91985202 -v -0.09394430 0.05321890 0.93428999 -v -0.09733950 0.08637760 0.91003603 -v -0.08029690 -0.00539620 0.97496098 -v -0.08835910 0.02171780 0.95541102 -v -0.03139180 -0.12188700 0.98399198 -v -0.06409970 -0.15863200 0.97403598 -v -0.03174970 -0.15708500 0.97819602 -v -0.02737840 -0.07608180 0.99372101 -v -0.05977000 -0.09423440 0.98418999 -v -0.02984250 -0.09369760 0.98879302 -v -0.09565230 -0.12370700 0.97208500 -v -0.08100190 -0.07337970 0.98285502 -v -0.08986710 -0.09318110 0.97711402 -v -0.09765010 -0.16022500 0.96698499 -v -0.08645290 -0.06401660 0.98579001 -v -0.07892690 -0.06284000 0.99495900 -v -0.09559990 -0.04769730 0.98596901 -v -0.09409510 -0.05654120 0.98501998 -v -0.05252760 -0.07753740 1.01482999 -v -0.06663470 -0.06440790 1.00864005 -v -0.05989890 -0.07533910 1.00400996 -v -0.06529460 -0.07005230 1.00522995 -v -0.05984110 -0.05361980 1.01768005 -v -0.07884250 -0.04882710 1.00064003 -v -0.05250090 -0.06621290 1.02310002 -v -0.06526080 -0.05825490 1.01250994 -v -0.08610680 -0.03064330 0.98915303 -v -0.09387690 -0.03857120 0.98682803 -v -0.05825980 -0.04039760 1.01189995 -v -0.04761840 -0.02239710 1.00059998 -v -0.06947060 -0.02539400 0.99450201 -v -0.04265670 -0.06275880 1.03251004 -v -0.03448460 -0.05343020 1.03232002 -v -0.04904390 -0.05252870 1.02500999 -v -0.02090470 -0.03967700 1.02316999 -v -0.01524620 -0.06768010 1.04602003 -v -0.01777890 -0.05477260 1.03744996 -v -0.02420060 -0.02122640 1.00514996 -v -0.02094760 -0.07797370 1.00715995 -v -0.04778560 -0.07182530 0.99557102 -v -0.02427570 -0.07260370 0.99989498 -v -0.01526670 -0.09409940 1.02437997 -v -0.03453510 -0.08452830 1.01120996 -v -0.01780690 -0.08690210 1.01538002 -v -0.05838710 -0.07357600 0.99823302 -v -0.04270120 -0.08547580 1.01505005 -v -0.04910570 -0.08041930 1.00671005 -v -0.06976390 -0.06903710 0.99008799 -v -0.03949090 -0.07962540 1.02906001 -v -0.02714440 -0.07633090 1.04138994 -v -0.03993180 -0.07205890 1.03309000 -v -0.02716370 -0.09052630 1.02914000 -v -0.03995510 -0.08465440 1.02277005 -v -0.01322720 -0.08893160 1.04223001 -v -0.01374000 -0.09427590 1.03401995 -v -0.01372910 -0.07956640 1.04691994 - -f 739 735 736 -f 189 736 735 -f 192 738 737 -f 739 737 738 -f 190 741 740 -f 743 740 741 -f 736 189 743 -f 742 743 189 -f 745 747 191 -f 744 191 747 -f 746 747 190 -f 741 190 747 -f 748 192 750 -f 737 750 192 -f 191 749 745 -f 750 745 749 -f 752 754 194 -f 751 194 754 -f 753 189 754 -f 735 754 189 -f 195 756 755 -f 758 755 756 -f 194 757 752 -f 758 752 757 -f 759 196 762 -f 760 762 196 -f 761 762 195 -f 756 195 762 -f 764 742 753 -f 189 753 742 -f 196 763 760 -f 764 760 763 -f 769 765 766 -f 198 766 765 -f 768 769 201 -f 767 201 769 -f 771 773 199 -f 770 199 773 -f 772 773 198 -f 766 198 773 -f 200 775 774 -f 777 774 775 -f 199 776 771 -f 777 771 776 -f 201 767 778 -f 780 778 767 -f 779 780 200 -f 775 200 780 -f 782 785 203 -f 781 203 785 -f 784 785 205 -f 783 205 785 -f 200 786 779 -f 788 779 786 -f 203 787 782 -f 788 782 787 -f 790 791 204 -f 789 204 791 -f 774 791 200 -f 786 200 791 -f 205 783 792 -f 794 792 783 -f 204 793 790 -f 794 790 793 -f 796 799 207 -f 795 207 799 -f 210 798 797 -f 799 797 798 -f 208 801 800 -f 803 800 801 -f 207 802 796 -f 803 796 802 -f 209 805 804 -f 807 804 805 -f 806 807 208 -f 801 208 807 -f 797 810 210 -f 808 210 810 -f 809 810 209 -f 805 209 810 -f 201 811 768 -f 814 768 811 -f 214 813 812 -f 814 812 813 -f 816 817 212 -f 815 212 817 -f 778 817 201 -f 811 201 817 -f 213 819 818 -f 821 818 819 -f 212 820 816 -f 821 816 820 -f 812 824 214 -f 822 214 824 -f 823 824 213 -f 819 213 824 -f 825 828 192 -f 738 192 828 -f 827 828 217 -f 826 217 828 -f 213 829 823 -f 830 823 829 -f 830 825 748 -f 192 748 825 -f 832 833 216 -f 831 216 833 -f 818 833 213 -f 829 213 833 -f 217 826 834 -f 836 834 826 -f 216 835 832 -f 836 832 835 -f 219 838 837 -f 841 837 838 -f 839 221 841 -f 840 841 221 -f 842 844 216 -f 835 216 844 -f 843 844 219 -f 838 219 844 -f 847 845 846 -f 220 846 845 -f 216 831 842 -f 847 842 831 -f 850 848 839 -f 221 839 848 -f 846 220 850 -f 849 850 220 -f 223 852 851 -f 854 851 852 -f 203 781 853 -f 854 853 781 -f 220 855 849 -f 857 849 855 -f 852 223 857 -f 856 857 223 -f 820 212 859 -f 858 859 212 -f 845 859 220 -f 855 220 859 -f 787 203 860 -f 853 860 203 -f 212 815 858 -f 860 858 815 -f 225 862 861 -f 864 861 862 -f 207 795 863 -f 864 863 795 -f 866 868 226 -f 865 226 868 -f 867 868 225 -f 862 225 868 -f 227 870 869 -f 872 869 870 -f 226 871 866 -f 872 866 871 -f 863 874 207 -f 802 207 874 -f 873 874 227 -f 870 227 874 -f 876 879 229 -f 875 229 879 -f 877 231 879 -f 878 879 231 -f 227 880 873 -f 882 873 880 -f 229 881 876 -f 882 876 881 -f 884 885 230 -f 883 230 885 -f 869 885 227 -f 880 227 885 -f 888 886 877 -f 231 877 886 -f 230 887 884 -f 888 884 887 -f 892 889 890 -f 233 890 889 -f 892 891 837 -f 219 837 891 -f 893 895 230 -f 887 230 895 -f 894 895 233 -f 890 233 895 -f 234 897 896 -f 898 896 897 -f 230 883 893 -f 898 893 883 -f 900 843 891 -f 219 891 843 -f 899 900 234 -f 897 234 900 -f 217 901 827 -f 903 827 901 -f 194 751 902 -f 903 902 751 -f 234 904 899 -f 905 899 904 -f 834 905 217 -f 901 217 905 -f 906 907 226 -f 871 226 907 -f 896 907 234 -f 904 234 907 -f 908 757 902 -f 194 902 757 -f 226 865 906 -f 908 906 865 -f 910 913 237 -f 909 237 913 -f 912 913 240 -f 911 240 913 -f 238 915 914 -f 917 914 915 -f 917 910 916 -f 237 916 910 -f 918 239 921 -f 919 921 239 -f 920 921 238 -f 915 238 921 -f 240 911 922 -f 924 922 911 -f 239 923 919 -f 924 919 923 -f 926 929 242 -f 925 242 929 -f 929 927 928 -f 244 928 927 -f 239 930 923 -f 932 923 930 -f 242 931 926 -f 932 926 931 -f 934 935 243 -f 933 243 935 -f 918 935 239 -f 930 239 935 -f 938 936 927 -f 244 927 936 -f 243 937 934 -f 938 934 937 -f 246 940 939 -f 943 939 940 -f 249 942 941 -f 943 941 942 -f 945 947 247 -f 944 247 947 -f 946 947 246 -f 940 246 947 -f 951 948 949 -f 248 949 948 -f 247 950 945 -f 951 945 950 -f 952 249 954 -f 941 954 249 -f 953 954 248 -f 949 248 954 -f 955 958 244 -f 928 244 958 -f 957 958 252 -f 956 252 958 -f 251 960 959 -f 961 959 960 -f 244 936 955 -f 961 955 936 -f 962 964 247 -f 950 247 964 -f 963 964 251 -f 960 251 964 -f 252 956 965 -f 966 965 956 -f 247 944 962 -f 966 962 944 -f 221 967 840 -f 970 840 967 -f 255 969 968 -f 970 968 969 -f 972 973 254 -f 971 254 973 -f 848 973 221 -f 967 221 973 -f 976 931 974 -f 242 974 931 -f 254 975 972 -f 976 972 975 -f 968 978 255 -f 977 255 978 -f 974 242 978 -f 925 978 242 -f 980 982 257 -f 979 257 982 -f 886 982 231 -f 981 231 982 -f 985 946 983 -f 246 983 946 -f 257 984 980 -f 985 980 984 -f 258 987 986 -f 988 986 987 -f 246 939 983 -f 988 983 939 -f 231 981 878 -f 990 878 981 -f 990 987 989 -f 258 989 987 -f 991 260 994 -f 992 994 260 -f 792 994 205 -f 993 205 994 -f 916 237 997 -f 995 997 237 -f 260 996 992 -f 997 992 996 -f 999 1000 261 -f 998 261 1000 -f 237 909 995 -f 1000 995 909 -f 205 993 784 -f 1002 784 993 -f 1002 999 1001 -f 261 1001 999 -f 1003 1005 257 -f 984 257 1005 -f 965 1005 252 -f 1004 252 1005 -f 233 1006 894 -f 1007 894 1006 -f 257 979 1003 -f 1007 1003 979 -f 1008 1009 255 -f 969 255 1009 -f 889 1009 233 -f 1006 233 1009 -f 252 1004 957 -f 1010 957 1004 -f 255 977 1008 -f 1010 1008 977 -f 223 1011 856 -f 1013 856 1011 -f 254 971 1012 -f 1013 1012 971 -f 1014 1015 261 -f 1001 261 1015 -f 851 1015 223 -f 1011 223 1015 -f 240 1016 912 -f 1017 912 1016 -f 261 998 1014 -f 1017 1014 998 -f 1012 1018 254 -f 975 254 1018 -f 922 1018 240 -f 1016 240 1018 -f 1019 265 1022 -f 1020 1022 265 -f 1022 1021 991 -f 260 991 1021 -f 1023 266 1026 -f 1024 1026 266 -f 1025 1026 265 -f 1020 265 1026 -f 1030 1027 1028 -f 267 1028 1027 -f 266 1029 1024 -f 1030 1024 1029 -f 1021 1032 260 -f 996 260 1032 -f 1028 267 1032 -f 1031 1032 267 -f 269 1034 1033 -f 1036 1033 1034 -f 1036 1035 1023 -f 266 1023 1035 -f 1038 1040 270 -f 1037 270 1040 -f 1039 1040 269 -f 1034 269 1040 -f 1044 1041 1042 -f 271 1042 1041 -f 270 1043 1038 -f 1044 1038 1043 -f 1035 1046 266 -f 1029 266 1046 -f 1042 271 1046 -f 1045 1046 271 -f 1048 1050 273 -f 1047 273 1050 -f 1033 1050 269 -f 1049 269 1050 -f 274 1052 1051 -f 1054 1051 1052 -f 273 1053 1048 -f 1054 1048 1053 -f 1056 1058 275 -f 1055 275 1058 -f 1057 1058 274 -f 1052 274 1058 -f 269 1049 1039 -f 1060 1039 1049 -f 275 1059 1056 -f 1060 1056 1059 -f 1061 1064 275 -f 1059 275 1064 -f 1063 1064 279 -f 1062 279 1064 -f 277 1066 1065 -f 1067 1065 1066 -f 275 1055 1061 -f 1067 1061 1055 -f 278 1069 1068 -f 1071 1068 1069 -f 1070 1071 277 -f 1066 277 1071 -f 279 1062 1072 -f 1074 1072 1062 -f 1073 1074 278 -f 1069 278 1074 -f 1076 1079 281 -f 1075 281 1079 -f 1077 284 1079 -f 1078 1079 284 -f 1081 1083 282 -f 1080 282 1083 -f 281 1082 1076 -f 1083 1076 1082 -f 283 1085 1084 -f 1087 1084 1085 -f 282 1086 1081 -f 1087 1081 1086 -f 284 1077 1088 -f 1090 1088 1077 -f 1090 1085 1089 -f 283 1089 1085 -f 1092 1095 286 -f 1091 286 1095 -f 1095 1093 1094 -f 289 1094 1093 -f 1097 1099 287 -f 1096 287 1099 -f 286 1098 1092 -f 1099 1092 1098 -f 288 1101 1100 -f 1103 1100 1101 -f 287 1102 1097 -f 1103 1097 1102 -f 289 1093 1104 -f 1106 1104 1093 -f 1101 288 1106 -f 1105 1106 288 -f 225 1107 867 -f 1110 867 1107 -f 292 1109 1108 -f 1110 1108 1109 -f 1112 1113 291 -f 1111 291 1113 -f 861 1113 225 -f 1107 225 1113 -f 289 1114 1094 -f 1116 1094 1114 -f 291 1115 1112 -f 1116 1112 1115 -f 1108 1118 292 -f 1117 292 1118 -f 289 1104 1114 -f 1118 1114 1104 -f 1120 1123 294 -f 1119 294 1123 -f 1122 1123 296 -f 1121 296 1123 -f 1127 1124 1125 -f 295 1125 1124 -f 294 1126 1120 -f 1127 1120 1126 -f 1128 1130 287 -f 1102 287 1130 -f 295 1129 1125 -f 1130 1125 1129 -f 296 1121 1131 -f 1132 1131 1121 -f 287 1096 1128 -f 1132 1128 1096 -f 1133 1135 292 -f 1109 292 1135 -f 755 1135 195 -f 1134 195 1135 -f 288 1136 1105 -f 1137 1105 1136 -f 292 1117 1133 -f 1137 1133 1117 -f 295 1138 1129 -f 1139 1129 1138 -f 1136 288 1139 -f 1100 1139 288 -f 195 1134 761 -f 1140 761 1134 -f 295 1124 1138 -f 1140 1138 1124 -f 1143 1122 1141 -f 296 1141 1122 -f 1143 1142 808 -f 210 808 1142 -f 1144 1145 286 -f 1098 286 1145 -f 1141 296 1145 -f 1131 1145 296 -f 291 1146 1115 -f 1147 1115 1146 -f 286 1091 1144 -f 1147 1144 1091 -f 1142 1148 210 -f 798 210 1148 -f 1146 291 1148 -f 1111 1148 291 -f 300 1150 1149 -f 1152 1149 1150 -f 214 822 1151 -f 1152 1151 822 -f 1153 1155 281 -f 1082 281 1155 -f 1150 300 1155 -f 1154 1155 300 -f 301 1157 1156 -f 1158 1156 1157 -f 281 1075 1153 -f 1158 1153 1075 -f 1151 1160 214 -f 813 214 1160 -f 1157 301 1160 -f 1159 1160 301 -f 198 1161 772 -f 1164 772 1161 -f 1164 1162 1163 -f 303 1163 1162 -f 1165 1166 301 -f 1159 301 1166 -f 765 1166 198 -f 1161 198 1166 -f 284 1167 1078 -f 1168 1078 1167 -f 301 1156 1165 -f 1168 1165 1156 -f 1162 1170 303 -f 1169 303 1170 -f 1167 284 1170 -f 1088 1170 284 -f 305 1172 1171 -f 1174 1171 1172 -f 191 744 1173 -f 1174 1173 744 -f 1175 1177 282 -f 1086 282 1177 -f 1176 1177 305 -f 1172 305 1177 -f 300 1178 1154 -f 1179 1154 1178 -f 282 1080 1175 -f 1179 1175 1080 -f 1173 1180 191 -f 749 191 1180 -f 1149 1180 300 -f 1178 300 1180 -f 1181 1184 303 -f 1163 303 1184 -f 1183 1184 307 -f 1182 307 1184 -f 283 1185 1089 -f 1186 1089 1185 -f 303 1169 1181 -f 1186 1181 1169 -f 305 1187 1176 -f 1188 1176 1187 -f 283 1084 1185 -f 1188 1185 1084 -f 307 1182 1189 -f 1190 1189 1182 -f 1171 1190 305 -f 1187 305 1190 -f 1192 1194 309 -f 1191 309 1194 -f 1072 1194 279 -f 1193 279 1194 -f 1195 310 1198 -f 1196 1198 310 -f 1192 309 1198 -f 1197 1198 309 -f 1202 1199 1200 -f 311 1200 1199 -f 310 1201 1196 -f 1202 1196 1201 -f 1203 1205 270 -f 1043 270 1205 -f 1200 311 1205 -f 1204 1205 311 -f 279 1193 1063 -f 1206 1063 1193 -f 270 1037 1203 -f 1206 1203 1037 -f 1208 1211 313 -f 1207 313 1211 -f 1210 1211 316 -f 1209 316 1211 -f 314 1213 1212 -f 1215 1212 1213 -f 313 1214 1208 -f 1215 1208 1214 -f 315 1217 1216 -f 1219 1216 1217 -f 1219 1213 1218 -f 314 1218 1213 -f 1209 1222 316 -f 1220 316 1222 -f 1221 1222 315 -f 1217 315 1222 -f 1223 1225 310 -f 1201 310 1225 -f 1212 1225 314 -f 1224 314 1225 -f 318 1227 1226 -f 1228 1226 1227 -f 1228 1223 1195 -f 310 1195 1223 -f 1230 1232 319 -f 1229 319 1232 -f 1231 1232 318 -f 1227 318 1232 -f 314 1224 1218 -f 1234 1218 1224 -f 319 1233 1230 -f 1234 1230 1233 -f 1236 1238 321 -f 1235 321 1238 -f 1237 319 1238 -f 1229 1238 319 -f 322 1240 1239 -f 1242 1239 1240 -f 321 1241 1236 -f 1242 1236 1241 -f 315 1243 1221 -f 1245 1221 1243 -f 1240 322 1245 -f 1244 1245 322 -f 319 1237 1233 -f 1246 1233 1237 -f 1246 1243 1216 -f 315 1216 1243 -f 324 1248 1247 -f 1251 1247 1248 -f 326 1250 1249 -f 1251 1249 1250 -f 1253 1255 325 -f 1252 325 1255 -f 1254 1255 324 -f 1248 324 1255 -f 238 1256 920 -f 1258 920 1256 -f 325 1257 1253 -f 1258 1253 1257 -f 1249 1260 326 -f 1259 326 1260 -f 914 1260 238 -f 1256 238 1260 -f 1265 1261 1262 -f 328 1262 1261 -f 330 1264 1263 -f 1265 1263 1264 -f 1267 1269 329 -f 1266 329 1269 -f 1262 328 1269 -f 1268 1269 328 -f 251 1270 963 -f 1272 963 1270 -f 1272 1267 1271 -f 329 1271 1267 -f 1263 1274 330 -f 1273 330 1274 -f 959 1274 251 -f 1270 251 1274 -f 1278 1275 1276 -f 332 1276 1275 -f 329 1266 1277 -f 1278 1277 1266 -f 1280 1282 333 -f 1279 333 1282 -f 1276 332 1282 -f 1281 1282 332 -f 1285 953 1283 -f 248 1283 953 -f 333 1284 1280 -f 1285 1280 1284 -f 1271 329 1286 -f 1277 1286 329 -f 948 1286 248 -f 1283 248 1286 -f 335 1288 1287 -f 1291 1287 1288 -f 337 1290 1289 -f 1291 1289 1290 -f 1293 1295 336 -f 1292 336 1295 -f 1288 335 1295 -f 1294 1295 335 -f 1298 1183 1296 -f 307 1296 1183 -f 1298 1293 1297 -f 336 1297 1293 -f 1289 1300 337 -f 1299 337 1300 -f 1296 307 1300 -f 1189 1300 307 -f 1302 1305 339 -f 1301 339 1305 -f 1304 1305 341 -f 1303 341 1305 -f 340 1307 1306 -f 1309 1306 1307 -f 1309 1302 1308 -f 339 1308 1302 -f 1310 1312 294 -f 1126 294 1312 -f 1307 340 1312 -f 1311 1312 340 -f 341 1303 1313 -f 1314 1313 1303 -f 294 1119 1310 -f 1314 1310 1119 -f 1318 1315 1316 -f 343 1316 1315 -f 325 1252 1317 -f 1318 1317 1252 -f 1319 1321 330 -f 1264 330 1321 -f 1316 343 1321 -f 1320 1321 343 -f 243 1322 937 -f 1323 937 1322 -f 1323 1319 1273 -f 330 1273 1319 -f 1317 1324 325 -f 1257 325 1324 -f 933 1324 243 -f 1322 243 1324 -f 345 1326 1325 -f 1329 1325 1326 -f 346 1328 1327 -f 1329 1327 1328 -f 1330 1332 326 -f 1250 326 1332 -f 1331 1332 345 -f 1326 345 1332 -f 267 1333 1031 -f 1334 1031 1333 -f 326 1259 1330 -f 1334 1330 1259 -f 1335 346 1336 -f 1327 1336 346 -f 1027 1336 267 -f 1333 267 1336 -f 1341 1337 1338 -f 348 1338 1337 -f 349 1340 1339 -f 1341 1339 1340 -f 1342 1344 346 -f 1328 346 1344 -f 1338 348 1344 -f 1343 1344 348 -f 271 1345 1045 -f 1346 1045 1345 -f 1346 1342 1335 -f 346 1335 1342 -f 349 1339 1347 -f 1348 1347 1339 -f 1041 1348 271 -f 1345 271 1348 -f 1353 1349 1350 -f 351 1350 1349 -f 354 1352 1351 -f 1353 1351 1352 -f 1355 1357 352 -f 1354 352 1357 -f 1350 351 1357 -f 1356 1357 351 -f 353 1359 1358 -f 1361 1358 1359 -f 352 1360 1355 -f 1361 1355 1360 -f 1351 1364 354 -f 1362 354 1364 -f 1363 1364 353 -f 1359 353 1364 -f 1365 356 1369 -f 1366 1369 356 -f 1369 1367 1368 -f 357 1368 1367 -f 1370 1372 354 -f 1352 354 1372 -f 356 1371 1366 -f 1372 1366 1371 -f 1374 1073 1373 -f 278 1373 1073 -f 354 1362 1370 -f 1374 1370 1362 -f 1367 1376 357 -f 1375 357 1376 -f 278 1068 1373 -f 1376 1373 1068 -f 1381 1377 1378 -f 359 1378 1377 -f 360 1380 1379 -f 1381 1379 1380 -f 1384 1304 1382 -f 341 1382 1304 -f 1378 359 1384 -f 1383 1384 359 -f 209 1385 809 -f 1386 809 1385 -f 1382 341 1386 -f 1313 1386 341 -f 1379 1388 360 -f 1387 360 1388 -f 804 1388 209 -f 1385 209 1388 -f 1390 1392 362 -f 1389 362 1392 -f 1391 336 1392 -f 1292 1392 336 -f 363 1394 1393 -f 1396 1393 1394 -f 1396 1390 1395 -f 362 1395 1390 -f 1397 1399 199 -f 776 199 1399 -f 1398 1399 363 -f 1394 363 1399 -f 1400 1297 1391 -f 336 1391 1297 -f 199 770 1397 -f 1400 1397 770 -f 1402 1404 365 -f 1401 365 1404 -f 1403 363 1404 -f 1393 1404 363 -f 366 1406 1405 -f 1408 1405 1406 -f 1408 1402 1407 -f 365 1407 1402 -f 1409 1411 204 -f 793 204 1411 -f 1410 1411 366 -f 1406 366 1411 -f 363 1403 1398 -f 1412 1398 1403 -f 204 789 1409 -f 1412 1409 789 -f 1414 1416 368 -f 1413 368 1416 -f 1405 1416 366 -f 1415 366 1416 -f 1418 1420 369 -f 1417 369 1420 -f 1419 1420 368 -f 1414 368 1420 -f 265 1421 1025 -f 1423 1025 1421 -f 1423 1418 1422 -f 369 1422 1418 -f 366 1415 1410 -f 1424 1410 1415 -f 1424 1421 1019 -f 265 1019 1421 -f 371 1426 1425 -f 1428 1425 1426 -f 369 1417 1427 -f 1428 1427 1417 -f 372 1430 1429 -f 1432 1429 1430 -f 1431 1432 371 -f 1426 371 1432 -f 1433 1435 273 -f 1053 273 1435 -f 1434 1435 372 -f 1430 372 1435 -f 1427 1436 369 -f 1422 369 1436 -f 273 1047 1433 -f 1436 1433 1047 -f 1438 1440 374 -f 1437 374 1440 -f 1429 1440 372 -f 1439 372 1440 -f 375 1442 1441 -f 1444 1441 1442 -f 1444 1438 1443 -f 374 1443 1438 -f 1445 1447 274 -f 1057 274 1447 -f 1446 1447 375 -f 1442 375 1447 -f 372 1439 1434 -f 1448 1434 1439 -f 274 1051 1445 -f 1448 1445 1051 -f 1452 1449 1450 -f 377 1450 1449 -f 1451 375 1452 -f 1441 1452 375 -f 1453 1455 357 -f 1368 357 1455 -f 1450 377 1455 -f 1454 1455 377 -f 277 1456 1070 -f 1457 1070 1456 -f 357 1375 1453 -f 1457 1453 1375 -f 1446 375 1458 -f 1451 1458 375 -f 1065 1458 277 -f 1456 277 1458 -f 1462 1340 1459 -f 349 1459 1340 -f 1461 1462 380 -f 1460 380 1462 -f 1464 1204 1463 -f 311 1463 1204 -f 1459 349 1464 -f 1347 1464 349 -f 1465 1466 313 -f 1214 313 1466 -f 1199 1466 311 -f 1463 311 1466 -f 379 1468 1467 -f 1469 1467 1468 -f 313 1207 1465 -f 1469 1465 1207 -f 380 1460 1470 -f 1472 1470 1460 -f 1472 1468 1471 -f 379 1471 1468 -f 1363 353 1475 -f 1473 1475 353 -f 1191 1475 309 -f 1474 309 1475 -f 1477 1478 382 -f 1476 382 1478 -f 1358 1478 353 -f 1473 353 1478 -f 309 1474 1197 -f 1480 1197 1474 -f 382 1479 1477 -f 1480 1477 1479 -f 384 1482 1481 -f 1485 1481 1482 -f 387 1484 1483 -f 1485 1483 1484 -f 1487 1489 385 -f 1486 385 1489 -f 1488 1489 384 -f 1482 384 1489 -f 386 1491 1490 -f 1493 1490 1491 -f 385 1492 1487 -f 1493 1487 1492 -f 1483 1496 387 -f 1494 387 1496 -f 1491 386 1496 -f 1495 1496 386 -f 1501 1497 1498 -f 389 1498 1497 -f 392 1500 1499 -f 1501 1499 1500 -f 1503 1505 390 -f 1502 390 1505 -f 1498 389 1505 -f 1504 1505 389 -f 1507 1509 391 -f 1506 391 1509 -f 1509 1503 1508 -f 390 1508 1503 -f 1499 1512 392 -f 1510 392 1512 -f 391 1511 1507 -f 1512 1507 1511 -f 1513 394 1517 -f 1514 1517 394 -f 1516 1517 397 -f 1515 397 1517 -f 1521 1518 1519 -f 395 1519 1518 -f 1514 394 1521 -f 1520 1521 394 -f 1523 1525 396 -f 1522 396 1525 -f 1519 395 1525 -f 1524 1525 395 -f 397 1515 1526 -f 1528 1526 1515 -f 1528 1523 1527 -f 396 1527 1523 -f 399 1530 1529 -f 1532 1529 1530 -f 1502 1532 390 -f 1531 390 1532 -f 1534 1536 400 -f 1533 400 1536 -f 399 1535 1530 -f 1536 1530 1535 -f 1540 1537 1538 -f 401 1538 1537 -f 400 1539 1534 -f 1540 1534 1539 -f 1531 1542 390 -f 1508 390 1542 -f 1538 401 1542 -f 1541 1542 401 -f 403 1544 1543 -f 1546 1543 1544 -f 1546 1545 1533 -f 400 1533 1545 -f 395 1547 1524 -f 1549 1524 1547 -f 1549 1544 1548 -f 403 1548 1544 -f 1551 1552 404 -f 1550 404 1552 -f 1518 1552 395 -f 1547 395 1552 -f 1545 1554 400 -f 1539 400 1554 -f 1554 1551 1553 -f 404 1553 1551 -f 1555 1558 392 -f 1500 392 1558 -f 407 1557 1556 -f 1558 1556 1557 -f 397 1559 1516 -f 1560 1516 1559 -f 392 1510 1555 -f 1560 1555 1510 -f 406 1562 1561 -f 1563 1561 1562 -f 1526 1563 397 -f 1559 397 1563 -f 1556 1566 407 -f 1564 407 1566 -f 1565 1566 406 -f 1562 406 1566 -f 1567 1570 407 -f 1557 407 1570 -f 1568 410 1570 -f 1569 1570 410 -f 409 1572 1571 -f 1573 1571 1572 -f 407 1564 1567 -f 1573 1567 1564 -f 1574 1576 321 -f 1241 321 1576 -f 1575 1576 409 -f 1572 409 1576 -f 318 1577 1231 -f 1578 1231 1577 -f 321 1235 1574 -f 1578 1574 1235 -f 1568 1580 410 -f 1579 410 1580 -f 1226 1580 318 -f 1577 318 1580 -f 1581 412 1584 -f 1582 1584 412 -f 1561 1584 406 -f 1583 406 1584 -f 1587 1210 1585 -f 316 1585 1210 -f 1587 1582 1586 -f 412 1586 1582 -f 322 1588 1244 -f 1589 1244 1588 -f 1589 1585 1220 -f 316 1220 1585 -f 1591 1575 1590 -f 409 1590 1575 -f 322 1239 1588 -f 1591 1588 1239 -f 406 1583 1565 -f 1592 1565 1583 -f 409 1571 1590 -f 1592 1590 1571 -f 414 1594 1593 -f 1596 1593 1594 -f 396 1522 1595 -f 1596 1595 1522 -f 415 1598 1597 -f 1600 1597 1598 -f 1600 1594 1599 -f 414 1599 1594 -f 1601 1603 379 -f 1471 379 1603 -f 1602 1603 415 -f 1598 415 1603 -f 1605 1586 1604 -f 412 1604 1586 -f 379 1467 1601 -f 1605 1601 1467 -f 1527 396 1606 -f 1595 1606 396 -f 1604 412 1606 -f 1581 1606 412 -f 1608 1611 417 -f 1607 417 1611 -f 1609 419 1611 -f 1610 1611 419 -f 1612 1614 399 -f 1535 399 1614 -f 1614 1608 1613 -f 417 1613 1608 -f 418 1616 1615 -f 1617 1615 1616 -f 1612 399 1617 -f 1529 1617 399 -f 1618 1620 352 -f 1360 352 1620 -f 1619 1620 418 -f 1616 418 1620 -f 419 1609 1621 -f 1622 1621 1609 -f 352 1354 1618 -f 1622 1618 1354 -f 414 1623 1599 -f 1626 1599 1623 -f 1625 1626 421 -f 1624 421 1626 -f 1548 403 1628 -f 1627 1628 403 -f 1593 1628 414 -f 1623 414 1628 -f 1629 1630 417 -f 1613 417 1630 -f 1627 403 1630 -f 1543 1630 403 -f 1632 1631 1624 -f 421 1624 1631 -f 417 1607 1629 -f 1632 1629 1607 -f 418 1633 1619 -f 1635 1619 1633 -f 382 1476 1634 -f 1635 1634 1476 -f 389 1636 1504 -f 1637 1504 1636 -f 1615 1637 418 -f 1633 418 1637 -f 1638 1639 410 -f 1569 410 1639 -f 1497 1639 389 -f 1636 389 1639 -f 1634 1640 382 -f 1479 382 1640 -f 1579 1640 410 -f 1638 410 1640 -f 1644 1641 1642 -f 424 1642 1641 -f 391 1506 1643 -f 1644 1643 1506 -f 384 1645 1488 -f 1647 1488 1645 -f 424 1646 1642 -f 1647 1642 1646 -f 425 1649 1648 -f 1650 1648 1649 -f 384 1481 1645 -f 1650 1645 1481 -f 1643 1652 391 -f 1511 391 1652 -f 1651 1652 425 -f 1649 425 1652 -f 1653 427 1656 -f 1654 1656 427 -f 1537 1656 401 -f 1655 401 1656 -f 385 1657 1492 -f 1659 1492 1657 -f 427 1658 1654 -f 1659 1654 1658 -f 424 1660 1646 -f 1661 1646 1660 -f 385 1486 1657 -f 1661 1657 1486 -f 401 1655 1541 -f 1662 1541 1655 -f 1641 1662 424 -f 1660 424 1662 -f 1666 1663 1664 -f 429 1664 1663 -f 404 1550 1665 -f 1666 1665 1550 -f 386 1667 1495 -f 1669 1495 1667 -f 429 1668 1664 -f 1669 1664 1668 -f 1670 1671 427 -f 1658 427 1671 -f 1667 386 1671 -f 1490 1671 386 -f 1553 404 1672 -f 1665 1672 404 -f 1672 1670 1653 -f 427 1653 1670 -f 1651 425 1675 -f 1673 1675 425 -f 1513 1675 394 -f 1674 394 1675 -f 387 1676 1484 -f 1677 1484 1676 -f 425 1648 1673 -f 1677 1673 1648 -f 429 1678 1668 -f 1679 1668 1678 -f 387 1494 1676 -f 1679 1676 1494 -f 394 1674 1520 -f 1680 1520 1674 -f 1680 1678 1663 -f 429 1663 1678 -f 1681 1684 196 -f 763 196 1684 -f 1683 1684 434 -f 1682 434 1684 -f 1686 1687 432 -f 1685 432 1687 -f 1687 1681 759 -f 196 759 1681 -f 1689 1691 433 -f 1688 433 1691 -f 1691 1686 1690 -f 432 1690 1686 -f 434 1682 1692 -f 1694 1692 1682 -f 1694 1689 1693 -f 433 1693 1689 -f 340 1695 1311 -f 1697 1311 1695 -f 432 1685 1696 -f 1697 1696 1685 -f 1699 1700 436 -f 1698 436 1700 -f 1306 1700 340 -f 1695 340 1700 -f 437 1702 1701 -f 1704 1701 1702 -f 436 1703 1699 -f 1704 1699 1703 -f 1690 432 1706 -f 1696 1706 432 -f 1705 1706 437 -f 1702 437 1706 -f 1707 1710 337 -f 1290 337 1710 -f 1709 1710 441 -f 1708 441 1710 -f 439 1712 1711 -f 1713 1711 1712 -f 337 1299 1707 -f 1713 1707 1299 -f 1715 1717 440 -f 1714 440 1717 -f 1716 1717 439 -f 1712 439 1717 -f 441 1708 1718 -f 1720 1718 1708 -f 440 1719 1715 -f 1720 1715 1719 -f 1723 746 1721 -f 190 1721 746 -f 1722 439 1723 -f 1711 1723 439 -f 1725 1683 1724 -f 434 1724 1683 -f 1721 190 1725 -f 740 1725 190 -f 1728 1726 1727 -f 443 1727 1726 -f 434 1692 1724 -f 1728 1724 1692 -f 1730 1716 1722 -f 439 1722 1716 -f 1727 443 1730 -f 1729 1730 443 -f 445 1732 1731 -f 1734 1731 1732 -f 1701 1734 437 -f 1733 437 1734 -f 446 1736 1735 -f 1738 1735 1736 -f 1737 1738 445 -f 1732 445 1738 -f 1739 1741 433 -f 1693 433 1741 -f 1740 1741 446 -f 1736 446 1741 -f 437 1733 1705 -f 1742 1705 1733 -f 433 1688 1739 -f 1742 1739 1688 -f 1746 1743 1744 -f 448 1744 1743 -f 446 1735 1745 -f 1746 1745 1735 -f 1747 1749 440 -f 1719 440 1749 -f 1744 448 1749 -f 1748 1749 448 -f 443 1750 1729 -f 1751 1729 1750 -f 440 1714 1747 -f 1751 1747 1714 -f 1745 1752 446 -f 1740 446 1752 -f 1726 1752 443 -f 1750 443 1752 -f 1754 1757 450 -f 1753 450 1757 -f 1756 1757 452 -f 1755 452 1757 -f 451 1759 1758 -f 1761 1758 1759 -f 450 1760 1754 -f 1761 1754 1760 -f 452 1755 1762 -f 1764 1762 1755 -f 1763 1764 451 -f 1759 451 1764 -f 452 1765 1756 -f 1768 1756 1765 -f 1766 455 1768 -f 1767 1768 455 -f 1770 1771 454 -f 1769 454 1771 -f 1762 1771 452 -f 1765 452 1771 -f 208 1772 806 -f 1774 806 1772 -f 454 1773 1770 -f 1774 1770 1773 -f 1775 1776 229 -f 881 229 1776 -f 800 1776 208 -f 1772 208 1776 -f 1778 1777 1766 -f 455 1766 1777 -f 229 875 1775 -f 1778 1775 875 -f 455 1779 1767 -f 1781 1767 1779 -f 450 1753 1780 -f 1781 1780 1753 -f 1782 1783 258 -f 989 258 1783 -f 1777 1783 455 -f 1779 455 1783 -f 1784 1785 249 -f 942 249 1785 -f 258 986 1782 -f 1785 1782 986 -f 1786 457 1788 -f 1787 1788 457 -f 1784 249 1788 -f 952 1788 249 -f 1780 1790 450 -f 1760 450 1790 -f 1789 1790 457 -f 1787 457 1790 -f 1792 1795 459 -f 1791 459 1795 -f 1793 460 1795 -f 1794 1795 460 -f 457 1796 1789 -f 1798 1789 1796 -f 459 1797 1792 -f 1798 1792 1797 -f 1284 333 1800 -f 1799 1800 333 -f 1786 1800 457 -f 1796 457 1800 -f 1802 1801 1793 -f 460 1793 1801 -f 333 1279 1799 -f 1802 1799 1279 -f 360 1803 1380 -f 1806 1380 1803 -f 463 1805 1804 -f 1806 1804 1805 -f 1807 1808 454 -f 1773 454 1808 -f 1387 1808 360 -f 1803 360 1808 -f 462 1810 1809 -f 1811 1809 1810 -f 454 1769 1807 -f 1811 1807 1769 -f 1804 1814 463 -f 1812 463 1814 -f 1813 1814 462 -f 1810 462 1814 -f 451 1815 1763 -f 1818 1763 1815 -f 467 1817 1816 -f 1818 1816 1817 -f 1821 1819 1820 -f 465 1820 1819 -f 1758 1821 451 -f 1815 451 1821 -f 1823 1825 466 -f 1822 466 1825 -f 1820 465 1825 -f 1824 1825 465 -f 1826 467 1828 -f 1816 1828 467 -f 1823 466 1828 -f 1827 1828 466 -f 1829 1831 459 -f 1797 459 1831 -f 1819 1831 465 -f 1830 465 1831 -f 469 1833 1832 -f 1834 1832 1833 -f 459 1791 1829 -f 1834 1829 1791 -f 1836 1838 470 -f 1835 470 1838 -f 1837 1838 469 -f 1833 469 1838 -f 465 1830 1824 -f 1840 1824 1830 -f 470 1839 1836 -f 1840 1836 1839 -f 1844 1813 1841 -f 462 1841 1813 -f 473 1843 1842 -f 1844 1842 1843 -f 1845 1846 467 -f 1817 467 1846 -f 1841 462 1846 -f 1809 1846 462 -f 472 1848 1847 -f 1849 1847 1848 -f 1849 1845 1826 -f 467 1826 1845 -f 1842 1852 473 -f 1850 473 1852 -f 1851 1852 472 -f 1848 472 1852 -f 1853 1855 470 -f 1839 470 1855 -f 1854 466 1855 -f 1822 1855 466 -f 1858 1856 1857 -f 475 1857 1856 -f 470 1835 1853 -f 1858 1853 1835 -f 472 1859 1851 -f 1861 1851 1859 -f 475 1860 1857 -f 1861 1857 1860 -f 1854 1862 466 -f 1827 466 1862 -f 1859 472 1862 -f 1847 1862 472 -f 477 1864 1863 -f 1867 1863 1864 -f 1867 1865 1866 -f 480 1866 1865 -f 478 1869 1868 -f 1871 1868 1869 -f 1870 1871 477 -f 1864 477 1871 -f 1872 479 1875 -f 1873 1875 479 -f 1874 1875 478 -f 1869 478 1875 -f 1865 1878 480 -f 1876 480 1878 -f 479 1877 1873 -f 1878 1873 1877 -f 1879 1882 480 -f 1866 480 1882 -f 1880 484 1882 -f 1881 1882 484 -f 482 1884 1883 -f 1885 1883 1884 -f 1885 1879 1876 -f 480 1876 1879 -f 1887 1889 483 -f 1886 483 1889 -f 1888 1889 482 -f 1884 482 1889 -f 484 1880 1890 -f 1892 1890 1880 -f 483 1891 1887 -f 1892 1887 1891 -f 1894 1897 486 -f 1893 486 1897 -f 1897 1895 1896 -f 489 1896 1895 -f 1899 1901 487 -f 1898 487 1901 -f 486 1900 1894 -f 1901 1894 1900 -f 488 1903 1902 -f 1905 1902 1903 -f 487 1904 1899 -f 1905 1899 1904 -f 1895 1908 489 -f 1906 489 1908 -f 1907 1908 488 -f 1903 488 1908 -f 1910 1913 491 -f 1909 491 1913 -f 1912 1913 493 -f 1911 493 1913 -f 492 1915 1914 -f 1917 1914 1915 -f 491 1916 1910 -f 1917 1910 1916 -f 1918 1920 487 -f 1904 487 1920 -f 1919 1920 492 -f 1915 492 1920 -f 493 1911 1921 -f 1922 1921 1911 -f 487 1898 1918 -f 1922 1918 1898 -f 495 1924 1923 -f 1927 1923 1924 -f 1926 1927 498 -f 1925 498 1927 -f 1929 1931 496 -f 1928 496 1931 -f 1930 1931 495 -f 1924 495 1931 -f 1933 1935 497 -f 1932 497 1935 -f 496 1934 1929 -f 1935 1929 1934 -f 498 1925 1936 -f 1938 1936 1925 -f 497 1937 1933 -f 1938 1933 1937 -f 500 1940 1939 -f 1942 1939 1940 -f 486 1893 1941 -f 1942 1941 1893 -f 1944 1946 501 -f 1943 501 1946 -f 1945 1946 500 -f 1940 500 1946 -f 502 1948 1947 -f 1950 1947 1948 -f 501 1949 1944 -f 1950 1944 1949 -f 1941 1952 486 -f 1900 486 1952 -f 1951 1952 502 -f 1948 502 1952 -f 1954 1956 504 -f 1953 504 1956 -f 1955 477 1956 -f 1863 1956 477 -f 505 1958 1957 -f 1960 1957 1958 -f 504 1959 1954 -f 1960 1954 1959 -f 1961 1963 501 -f 1949 501 1963 -f 1962 1963 505 -f 1958 505 1963 -f 1964 1870 1955 -f 477 1955 1870 -f 501 1943 1961 -f 1964 1961 1943 -f 1966 1969 507 -f 1965 507 1969 -f 509 1968 1967 -f 1969 1967 1968 -f 1971 1973 508 -f 1970 508 1973 -f 1973 1966 1972 -f 507 1972 1966 -f 505 1974 1962 -f 1976 1962 1974 -f 1976 1971 1975 -f 508 1975 1971 -f 1977 509 1978 -f 1967 1978 509 -f 1957 1978 505 -f 1974 505 1978 -f 493 1979 1912 -f 1982 1912 1979 -f 511 1981 1980 -f 1982 1980 1981 -f 502 1983 1951 -f 1984 1951 1983 -f 1921 1984 493 -f 1979 493 1984 -f 1975 508 1986 -f 1985 1986 508 -f 1947 1986 502 -f 1983 502 1986 -f 1980 1988 511 -f 1987 511 1988 -f 508 1970 1985 -f 1988 1985 1970 -f 498 1989 1926 -f 1992 1926 1989 -f 515 1991 1990 -f 1992 1990 1991 -f 1994 1995 513 -f 1993 513 1995 -f 1936 1995 498 -f 1989 498 1995 -f 514 1997 1996 -f 1999 1996 1997 -f 513 1998 1994 -f 1999 1994 1998 -f 1990 2002 515 -f 2000 515 2002 -f 2001 2002 514 -f 1997 514 2002 -f 2004 2007 517 -f 2003 517 2007 -f 2006 2007 519 -f 2005 519 2007 -f 518 2009 2008 -f 2011 2008 2009 -f 2011 2004 2010 -f 517 2010 2004 -f 2012 2014 513 -f 1998 513 2014 -f 2013 2014 518 -f 2009 518 2014 -f 519 2005 2015 -f 2016 2015 2005 -f 513 1993 2012 -f 2016 2012 1993 -f 2020 1968 2017 -f 509 2017 1968 -f 2020 2018 2019 -f 522 2019 2018 -f 2021 521 2023 -f 2022 2023 521 -f 2023 2017 1977 -f 509 1977 2017 -f 518 2024 2013 -f 2026 2013 2024 -f 521 2025 2022 -f 2026 2022 2025 -f 2018 2028 522 -f 2027 522 2028 -f 2008 2028 518 -f 2024 518 2028 -f 484 2029 1881 -f 2031 1881 2029 -f 504 1953 2030 -f 2031 2030 1953 -f 514 2032 2001 -f 2033 2001 2032 -f 1890 2033 484 -f 2029 484 2033 -f 2034 2035 521 -f 2025 521 2035 -f 1996 2035 514 -f 2032 514 2035 -f 1959 504 2036 -f 2030 2036 504 -f 521 2021 2034 -f 2036 2034 2021 -f 2038 2041 525 -f 2037 525 2041 -f 2040 2041 528 -f 2039 528 2041 -f 526 2043 2042 -f 2045 2042 2043 -f 525 2044 2038 -f 2045 2038 2044 -f 2047 2049 527 -f 2046 527 2049 -f 2048 2049 526 -f 2043 526 2049 -f 2052 2050 2039 -f 528 2039 2050 -f 527 2051 2047 -f 2052 2047 2051 -f 2057 2053 2054 -f 530 2054 2053 -f 2056 2057 532 -f 2055 532 2057 -f 531 2059 2058 -f 2061 2058 2059 -f 2061 2054 2060 -f 530 2060 2054 -f 2062 2064 526 -f 2048 526 2064 -f 2063 2064 531 -f 2059 531 2064 -f 532 2055 2065 -f 2066 2065 2055 -f 526 2042 2062 -f 2066 2062 2042 -f 534 2068 2067 -f 2071 2067 2068 -f 537 2070 2069 -f 2071 2069 2070 -f 2072 535 2075 -f 2073 2075 535 -f 2074 2075 534 -f 2068 534 2075 -f 536 2077 2076 -f 2079 2076 2077 -f 2079 2073 2078 -f 535 2078 2073 -f 2080 537 2082 -f 2069 2082 537 -f 2081 2082 536 -f 2077 536 2082 -f 2084 2086 539 -f 2083 539 2086 -f 2053 2086 530 -f 2085 530 2086 -f 536 2087 2081 -f 2089 2081 2087 -f 539 2088 2084 -f 2089 2084 2088 -f 2091 2092 540 -f 2090 540 2092 -f 2076 2092 536 -f 2087 536 2092 -f 530 2085 2060 -f 2094 2060 2085 -f 540 2093 2091 -f 2094 2091 2093 -f 542 2096 2095 -f 2098 2095 2096 -f 507 1965 2097 -f 2098 2097 1965 -f 2099 2101 532 -f 2056 532 2101 -f 2100 2101 542 -f 2096 542 2101 -f 543 2103 2102 -f 2104 2102 2103 -f 2104 2099 2065 -f 532 2065 2099 -f 2097 2106 507 -f 1972 507 2106 -f 2105 2106 543 -f 2103 543 2106 -f 2010 517 2110 -f 2107 2110 517 -f 2109 2110 546 -f 2108 546 2110 -f 2113 2111 2112 -f 545 2112 2111 -f 517 2003 2107 -f 2113 2107 2003 -f 537 2114 2070 -f 2116 2070 2114 -f 545 2115 2112 -f 2116 2112 2115 -f 546 2108 2117 -f 2118 2117 2108 -f 2080 2118 537 -f 2114 537 2118 -f 2119 2122 491 -f 1916 491 2122 -f 2121 2122 549 -f 2120 549 2122 -f 2125 2123 2124 -f 548 2124 2123 -f 491 1909 2119 -f 2125 2119 1909 -f 528 2126 2040 -f 2128 2040 2126 -f 2124 548 2128 -f 2127 2128 548 -f 549 2120 2129 -f 2130 2129 2120 -f 2050 2130 528 -f 2126 528 2130 -f 2131 2133 539 -f 2088 539 2133 -f 2117 2133 546 -f 2132 546 2133 -f 542 2134 2100 -f 2135 2100 2134 -f 539 2083 2131 -f 2135 2131 2083 -f 2136 2137 522 -f 2019 522 2137 -f 2095 2137 542 -f 2134 542 2137 -f 546 2132 2109 -f 2138 2109 2132 -f 522 2027 2136 -f 2138 2136 2027 -f 543 2139 2105 -f 2141 2105 2139 -f 511 1987 2140 -f 2141 2140 1987 -f 2142 2143 525 -f 2044 525 2143 -f 2102 2143 543 -f 2139 543 2143 -f 548 2144 2127 -f 2145 2127 2144 -f 525 2037 2142 -f 2145 2142 2037 -f 2140 2146 511 -f 1981 511 2146 -f 2123 2146 548 -f 2144 548 2146 -f 2150 2121 2147 -f 549 2147 2121 -f 2149 2150 555 -f 2148 555 2150 -f 2152 2153 553 -f 2151 553 2153 -f 2147 549 2153 -f 2129 2153 549 -f 554 2155 2154 -f 2157 2154 2155 -f 2157 2152 2156 -f 553 2156 2152 -f 2158 555 2160 -f 2148 2160 555 -f 2159 2160 554 -f 2155 554 2160 -f 2164 2159 2161 -f 554 2161 2159 -f 559 2163 2162 -f 2164 2162 2163 -f 2166 2167 557 -f 2165 557 2167 -f 2161 554 2167 -f 2154 2167 554 -f 558 2169 2168 -f 2171 2168 2169 -f 2171 2166 2170 -f 557 2170 2166 -f 2162 2174 559 -f 2172 559 2174 -f 2173 2174 558 -f 2169 558 2174 -f 2175 2178 559 -f 2163 559 2178 -f 2177 2178 563 -f 2176 563 2178 -f 561 2180 2179 -f 2181 2179 2180 -f 559 2172 2175 -f 2181 2175 2172 -f 2183 2185 562 -f 2182 562 2185 -f 2184 2185 561 -f 2180 561 2185 -f 563 2176 2186 -f 2188 2186 2176 -f 562 2187 2183 -f 2188 2183 2187 -f 2190 2192 565 -f 2189 565 2192 -f 2179 2192 561 -f 2191 561 2192 -f 2194 2196 566 -f 2193 566 2196 -f 565 2195 2190 -f 2196 2190 2195 -f 2198 2200 567 -f 2197 567 2200 -f 566 2199 2194 -f 2200 2194 2199 -f 561 2191 2184 -f 2202 2184 2191 -f 567 2201 2198 -f 2202 2198 2201 -f 2204 2207 569 -f 2203 569 2207 -f 2205 572 2207 -f 2206 2207 572 -f 2209 2211 570 -f 2208 570 2211 -f 569 2210 2204 -f 2211 2204 2210 -f 571 2213 2212 -f 2215 2212 2213 -f 570 2214 2209 -f 2215 2209 2214 -f 572 2205 2216 -f 2218 2216 2205 -f 2213 571 2218 -f 2217 2218 571 -f 2220 2223 574 -f 2219 574 2223 -f 2221 577 2223 -f 2222 2223 577 -f 2225 2227 575 -f 2224 575 2227 -f 574 2226 2220 -f 2227 2220 2226 -f 576 2229 2228 -f 2231 2228 2229 -f 575 2230 2225 -f 2231 2225 2230 -f 577 2221 2232 -f 2234 2232 2221 -f 2229 576 2234 -f 2233 2234 576 -f 579 2236 2235 -f 2238 2235 2236 -f 515 2000 2237 -f 2238 2237 2000 -f 574 2239 2226 -f 2241 2226 2239 -f 2236 579 2241 -f 2240 2241 579 -f 580 2243 2242 -f 2244 2242 2243 -f 574 2219 2239 -f 2244 2239 2219 -f 2237 2246 515 -f 1991 515 2246 -f 2243 580 2246 -f 2245 2246 580 -f 2248 2251 582 -f 2247 582 2251 -f 2250 2251 584 -f 2249 584 2251 -f 576 2252 2233 -f 2254 2233 2252 -f 582 2253 2248 -f 2254 2248 2253 -f 583 2256 2255 -f 2257 2255 2256 -f 2252 576 2257 -f 2228 2257 576 -f 584 2249 2258 -f 2260 2258 2249 -f 2260 2256 2259 -f 583 2259 2256 -f 2261 2263 483 -f 1891 483 2263 -f 2235 2263 579 -f 2262 579 2263 -f 583 2264 2259 -f 2265 2259 2264 -f 483 1886 2261 -f 2265 2261 1886 -f 2266 2267 575 -f 2230 575 2267 -f 583 2255 2264 -f 2267 2264 2255 -f 579 2262 2240 -f 2268 2240 2262 -f 575 2224 2266 -f 2268 2266 2224 -f 2271 1930 2269 -f 495 2269 1930 -f 2271 2270 2247 -f 582 2247 2270 -f 2272 2273 580 -f 2245 580 2273 -f 2269 495 2273 -f 1923 2273 495 -f 577 2274 2222 -f 2275 2222 2274 -f 580 2242 2272 -f 2275 2272 2242 -f 2270 2276 582 -f 2253 582 2276 -f 2276 2274 2232 -f 577 2232 2274 -f 500 2277 1945 -f 2280 1945 2277 -f 589 2279 2278 -f 2280 2278 2279 -f 2282 2283 588 -f 2281 588 2283 -f 1939 2283 500 -f 2277 500 2283 -f 572 2284 2206 -f 2286 2206 2284 -f 588 2285 2282 -f 2286 2282 2285 -f 2278 2288 589 -f 2287 589 2288 -f 2284 572 2288 -f 2216 2288 572 -f 2292 2289 2290 -f 591 2290 2289 -f 489 1906 2291 -f 2292 2291 1906 -f 2293 2295 569 -f 2210 569 2295 -f 2290 591 2295 -f 2294 2295 591 -f 588 2296 2285 -f 2297 2285 2296 -f 569 2203 2293 -f 2297 2293 2203 -f 1896 489 2298 -f 2291 2298 489 -f 2296 588 2298 -f 2281 2298 588 -f 478 2299 1874 -f 2302 1874 2299 -f 593 2301 2300 -f 2302 2300 2301 -f 2303 2304 589 -f 2279 589 2304 -f 1868 2304 478 -f 2299 478 2304 -f 571 2305 2217 -f 2306 2217 2305 -f 589 2287 2303 -f 2306 2303 2287 -f 2300 2308 593 -f 2307 593 2308 -f 2212 2308 571 -f 2305 571 2308 -f 2310 2312 595 -f 2309 595 2312 -f 2289 2312 591 -f 2311 591 2312 -f 2313 2315 593 -f 2301 593 2315 -f 595 2314 2310 -f 2315 2310 2314 -f 570 2316 2214 -f 2317 2214 2316 -f 593 2307 2313 -f 2317 2313 2307 -f 591 2311 2294 -f 2318 2294 2311 -f 570 2208 2316 -f 2318 2316 2208 -f 2319 2322 565 -f 2195 565 2322 -f 2321 2322 599 -f 2320 599 2322 -f 558 2323 2173 -f 2324 2173 2323 -f 565 2189 2319 -f 2324 2319 2189 -f 2326 2327 597 -f 2325 597 2327 -f 2323 558 2327 -f 2168 2327 558 -f 598 2329 2328 -f 2331 2328 2329 -f 2331 2326 2330 -f 597 2330 2326 -f 2320 2334 599 -f 2332 599 2334 -f 2333 2334 598 -f 2329 598 2334 -f 2335 601 2339 -f 2336 2339 601 -f 2338 2339 604 -f 2337 604 2339 -f 2341 2343 602 -f 2340 602 2343 -f 2336 601 2343 -f 2342 2343 601 -f 2345 2347 603 -f 2344 603 2347 -f 602 2346 2341 -f 2347 2341 2346 -f 604 2337 2348 -f 2350 2348 2337 -f 603 2349 2345 -f 2350 2345 2349 -f 2351 2353 603 -f 2349 603 2353 -f 2352 598 2353 -f 2328 2353 598 -f 606 2355 2354 -f 2356 2354 2355 -f 603 2344 2351 -f 2356 2351 2344 -f 2358 2360 607 -f 2357 607 2360 -f 2359 2360 606 -f 2355 606 2360 -f 2362 2333 2352 -f 598 2352 2333 -f 607 2361 2358 -f 2362 2358 2361 -f 2363 2366 606 -f 2359 606 2366 -f 2365 2366 610 -f 2364 610 2366 -f 2367 2368 602 -f 2346 602 2368 -f 606 2354 2363 -f 2368 2363 2354 -f 2370 2371 609 -f 2369 609 2371 -f 602 2340 2367 -f 2371 2367 2340 -f 610 2364 2372 -f 2374 2372 2364 -f 609 2373 2370 -f 2374 2370 2373 -f 612 2376 2375 -f 2378 2375 2376 -f 324 1247 2377 -f 2378 2377 1247 -f 2379 2381 527 -f 2051 527 2381 -f 2380 2381 612 -f 2376 612 2381 -f 613 2383 2382 -f 2384 2382 2383 -f 527 2046 2379 -f 2384 2379 2046 -f 2377 2386 324 -f 1254 324 2386 -f 2385 2386 613 -f 2383 613 2386 -f 615 2388 2387 -f 2390 2387 2388 -f 2390 2389 1261 -f 328 1261 2389 -f 2391 2393 540 -f 2093 540 2393 -f 2392 2393 615 -f 2388 615 2393 -f 2396 2394 2395 -f 616 2395 2394 -f 540 2090 2391 -f 2396 2391 2090 -f 2389 2398 328 -f 1268 328 2398 -f 2395 616 2398 -f 2397 2398 616 -f 616 2399 2397 -f 2401 2397 2399 -f 2401 2400 1275 -f 332 1275 2400 -f 2078 535 2403 -f 2402 2403 535 -f 2394 2403 616 -f 2399 616 2403 -f 618 2405 2404 -f 2406 2404 2405 -f 2406 2402 2072 -f 535 2072 2402 -f 2400 2408 332 -f 1281 332 2408 -f 2405 618 2408 -f 2407 2408 618 -f 620 2410 2409 -f 2412 2409 2410 -f 335 1287 2411 -f 2412 2411 1287 -f 2413 2415 595 -f 2314 595 2415 -f 2414 2415 620 -f 2410 620 2415 -f 2418 2416 2417 -f 621 2417 2416 -f 2418 2413 2309 -f 595 2309 2413 -f 2411 2420 335 -f 1294 335 2420 -f 2417 621 2420 -f 2419 2420 621 -f 2421 623 2424 -f 2422 2424 623 -f 2423 339 2424 -f 1301 2424 339 -f 584 2425 2250 -f 2427 2250 2425 -f 623 2426 2422 -f 2427 2422 2426 -f 2429 2430 624 -f 2428 624 2430 -f 2425 584 2430 -f 2258 2430 584 -f 2432 1308 2423 -f 339 2423 1308 -f 624 2431 2429 -f 2432 2429 2431 -f 613 2433 2385 -f 2435 2385 2433 -f 2435 2434 1315 -f 343 1315 2434 -f 2063 531 2437 -f 2436 2437 531 -f 2382 2437 613 -f 2433 613 2437 -f 2439 2392 2438 -f 615 2438 2392 -f 531 2058 2436 -f 2439 2436 2058 -f 2434 2440 343 -f 1320 343 2440 -f 2438 615 2440 -f 2387 2440 615 -f 627 2442 2441 -f 2444 2441 2442 -f 345 1325 2443 -f 2444 2443 1325 -f 2156 553 2447 -f 2445 2447 553 -f 2446 2447 627 -f 2442 627 2447 -f 612 2448 2380 -f 2449 2380 2448 -f 553 2151 2445 -f 2449 2445 2151 -f 1331 345 2450 -f 2443 2450 345 -f 2375 2450 612 -f 2448 612 2450 -f 629 2452 2451 -f 2454 2451 2452 -f 2454 2453 1337 -f 348 1337 2453 -f 2170 557 2457 -f 2455 2457 557 -f 629 2456 2452 -f 2457 2452 2456 -f 2459 2446 2458 -f 627 2458 2446 -f 557 2165 2455 -f 2459 2455 2165 -f 2453 2460 348 -f 1343 348 2460 -f 2458 627 2460 -f 2441 2460 627 -f 631 2462 2461 -f 2464 2461 2462 -f 2464 2463 1349 -f 351 1349 2463 -f 2465 632 2468 -f 2466 2468 632 -f 2467 2468 631 -f 2462 631 2468 -f 633 2470 2469 -f 2472 2469 2470 -f 632 2471 2466 -f 2472 2466 2471 -f 2463 2474 351 -f 1356 351 2474 -f 2473 2474 633 -f 2470 633 2474 -f 2478 2475 2476 -f 635 2476 2475 -f 1365 2478 356 -f 2477 356 2478 -f 566 2479 2199 -f 2481 2199 2479 -f 2476 635 2481 -f 2480 2481 635 -f 631 2482 2467 -f 2483 2467 2482 -f 2193 2483 566 -f 2479 566 2483 -f 356 2477 1371 -f 2484 1371 2477 -f 2482 631 2484 -f 2461 2484 631 -f 637 2486 2485 -f 2488 2485 2486 -f 2488 2487 1377 -f 359 1377 2487 -f 2489 2491 496 -f 1934 496 2491 -f 2490 2491 637 -f 2486 637 2491 -f 2492 2493 623 -f 2426 623 2493 -f 496 1928 2489 -f 2493 2489 1928 -f 2487 2494 359 -f 1383 359 2494 -f 2494 2492 2421 -f 623 2421 2492 -f 2495 2497 621 -f 2419 621 2497 -f 2496 362 2497 -f 1389 2497 362 -f 488 2498 1907 -f 2499 1907 2498 -f 2499 2495 2416 -f 621 2416 2495 -f 2501 2502 639 -f 2500 639 2502 -f 1902 2502 488 -f 2498 488 2502 -f 2504 1395 2496 -f 362 2496 1395 -f 639 2503 2501 -f 2504 2501 2503 -f 2505 2507 639 -f 2503 639 2507 -f 2506 365 2507 -f 1401 2507 365 -f 492 2508 1919 -f 2509 1919 2508 -f 639 2500 2505 -f 2509 2505 2500 -f 2511 2512 641 -f 2510 641 2512 -f 1914 2512 492 -f 2508 492 2512 -f 2514 1407 2506 -f 365 2506 1407 -f 641 2513 2511 -f 2514 2511 2513 -f 2515 2517 641 -f 2513 641 2517 -f 2516 368 2517 -f 1413 2517 368 -f 2519 2149 2518 -f 555 2518 2149 -f 641 2510 2515 -f 2519 2515 2510 -f 2522 2520 2521 -f 643 2521 2520 -f 555 2158 2518 -f 2522 2518 2158 -f 1419 368 2524 -f 2516 2524 368 -f 2521 643 2524 -f 2523 2524 643 -f 643 2525 2523 -f 2527 2523 2525 -f 371 1425 2526 -f 2527 2526 1425 -f 563 2528 2177 -f 2529 2177 2528 -f 2520 2529 643 -f 2525 643 2529 -f 2531 2532 645 -f 2530 645 2532 -f 2186 2532 563 -f 2528 563 2532 -f 1431 371 2534 -f 2526 2534 371 -f 645 2533 2531 -f 2534 2531 2533 -f 2535 2537 645 -f 2533 645 2537 -f 2536 374 2537 -f 1437 2537 374 -f 562 2538 2187 -f 2539 2187 2538 -f 645 2530 2535 -f 2539 2535 2530 -f 2541 2542 647 -f 2540 647 2542 -f 2182 2542 562 -f 2538 562 2542 -f 2544 1443 2536 -f 374 2536 1443 -f 647 2543 2541 -f 2544 2541 2543 -f 2545 2547 647 -f 2543 647 2547 -f 2547 2546 1449 -f 377 1449 2546 -f 2548 2549 567 -f 2201 567 2549 -f 2540 2549 647 -f 2545 647 2549 -f 635 2550 2480 -f 2551 2480 2550 -f 567 2197 2548 -f 2551 2548 2197 -f 2546 2552 377 -f 1454 377 2552 -f 2550 635 2552 -f 2475 2552 635 -f 2555 1461 2553 -f 380 2553 1461 -f 2555 2554 2451 -f 629 2451 2554 -f 2557 2558 650 -f 2556 650 2558 -f 380 1470 2553 -f 2558 2553 1470 -f 604 2559 2338 -f 2561 2338 2559 -f 650 2560 2557 -f 2561 2557 2560 -f 2562 2563 597 -f 2330 597 2563 -f 2348 2563 604 -f 2559 604 2563 -f 2554 2564 629 -f 2456 629 2564 -f 2564 2562 2325 -f 597 2325 2562 -f 2321 599 2567 -f 2565 2567 599 -f 2465 2567 632 -f 2566 632 2567 -f 652 2569 2568 -f 2570 2568 2569 -f 599 2332 2565 -f 2570 2565 2332 -f 2471 632 2572 -f 2566 2572 632 -f 2571 2572 652 -f 2569 652 2572 -f 654 2574 2573 -f 2577 2573 2574 -f 657 2576 2575 -f 2577 2575 2576 -f 2579 2581 655 -f 2578 655 2581 -f 2580 2581 654 -f 2574 654 2581 -f 656 2583 2582 -f 2585 2582 2583 -f 655 2584 2579 -f 2585 2579 2584 -f 2575 2588 657 -f 2586 657 2588 -f 2587 2588 656 -f 2583 656 2588 -f 659 2590 2589 -f 2593 2589 2590 -f 2593 2591 2592 -f 662 2592 2591 -f 660 2595 2594 -f 2597 2594 2595 -f 2590 659 2597 -f 2596 2597 659 -f 2601 2598 2599 -f 661 2599 2598 -f 2595 660 2601 -f 2600 2601 660 -f 2591 2604 662 -f 2602 662 2604 -f 2599 661 2604 -f 2603 2604 661 -f 2606 2609 664 -f 2605 664 2609 -f 2608 2609 667 -f 2607 667 2609 -f 2613 2610 2611 -f 665 2611 2610 -f 664 2612 2606 -f 2613 2606 2612 -f 2615 2617 666 -f 2614 666 2617 -f 2611 665 2617 -f 2616 2617 665 -f 2607 2620 667 -f 2618 667 2620 -f 2620 2615 2619 -f 666 2619 2615 -f 2603 661 2624 -f 2621 2624 661 -f 671 2623 2622 -f 2624 2622 2623 -f 2626 2627 669 -f 2625 669 2627 -f 2621 661 2627 -f 2598 2627 661 -f 670 2629 2628 -f 2631 2628 2629 -f 2631 2626 2630 -f 669 2630 2626 -f 671 2622 2632 -f 2634 2632 2622 -f 2629 670 2634 -f 2633 2634 670 -f 2638 2633 2635 -f 670 2635 2633 -f 674 2637 2636 -f 2638 2636 2637 -f 2641 2639 2640 -f 673 2640 2639 -f 2635 670 2641 -f 2628 2641 670 -f 2619 666 2644 -f 2642 2644 666 -f 2644 2640 2643 -f 673 2643 2640 -f 2646 2645 2636 -f 674 2636 2645 -f 666 2614 2642 -f 2646 2642 2614 -f 676 2648 2647 -f 2650 2647 2648 -f 2589 2650 659 -f 2649 659 2650 -f 2652 2654 677 -f 2651 677 2654 -f 2653 2654 676 -f 2648 676 2654 -f 2612 664 2657 -f 2655 2657 664 -f 677 2656 2652 -f 2657 2652 2656 -f 659 2649 2596 -f 2658 2596 2649 -f 664 2605 2655 -f 2658 2655 2605 -f 2660 2662 679 -f 2659 679 2662 -f 2661 676 2662 -f 2647 2662 676 -f 2663 2665 607 -f 2361 607 2665 -f 2664 2665 679 -f 2660 679 2665 -f 610 2666 2365 -f 2667 2365 2666 -f 607 2357 2663 -f 2667 2663 2357 -f 2669 2670 680 -f 2668 680 2670 -f 2372 2670 610 -f 2666 610 2670 -f 676 2661 2653 -f 2672 2653 2661 -f 680 2671 2669 -f 2672 2669 2671 -f 2656 677 2676 -f 2673 2676 677 -f 2675 2676 682 -f 2674 682 2676 -f 680 2677 2671 -f 2678 2671 2677 -f 677 2651 2673 -f 2678 2673 2651 -f 609 2679 2373 -f 2680 2373 2679 -f 2680 2677 2668 -f 680 2668 2677 -f 2682 2342 2681 -f 601 2681 2342 -f 609 2369 2679 -f 2682 2679 2369 -f 2684 2683 2674 -f 682 2674 2683 -f 2684 2681 2335 -f 601 2335 2681 -f 665 2685 2616 -f 2688 2616 2685 -f 684 2687 2686 -f 2688 2686 2687 -f 2689 2690 682 -f 2675 682 2690 -f 2610 2690 665 -f 2685 665 2690 -f 650 2691 2560 -f 2692 2560 2691 -f 2692 2689 2683 -f 682 2683 2689 -f 2693 2694 415 -f 1602 415 2694 -f 2556 2694 650 -f 2691 650 2694 -f 2686 2696 684 -f 2695 684 2696 -f 415 1597 2693 -f 2696 2693 1597 -f 2697 2700 419 -f 1610 419 2700 -f 2699 2700 687 -f 2698 687 2700 -f 633 2701 2473 -f 2702 2473 2701 -f 419 1621 2697 -f 2702 2697 1621 -f 2704 2705 686 -f 2703 686 2705 -f 2469 2705 633 -f 2701 633 2705 -f 2706 2708 671 -f 2623 671 2708 -f 686 2707 2704 -f 2708 2704 2707 -f 2710 2709 2698 -f 687 2698 2709 -f 2706 671 2710 -f 2632 2710 671 -f 1625 421 2713 -f 2711 2713 421 -f 684 2695 2712 -f 2713 2712 2695 -f 687 2714 2699 -f 2715 2699 2714 -f 2715 2711 1631 -f 421 1631 2711 -f 2716 2717 674 -f 2637 674 2717 -f 2714 687 2717 -f 2709 2717 687 -f 2712 2718 684 -f 2687 684 2718 -f 2645 2718 674 -f 2716 674 2718 -f 652 2719 2571 -f 2721 2571 2719 -f 686 2703 2720 -f 2721 2720 2703 -f 2664 679 2723 -f 2722 2723 679 -f 2568 2723 652 -f 2719 652 2723 -f 2724 2725 662 -f 2592 662 2725 -f 2659 2725 679 -f 2722 679 2725 -f 2720 2726 686 -f 2707 686 2726 -f 662 2602 2724 -f 2726 2724 2602 -f 660 2727 2600 -f 2730 2600 2727 -f 2730 2728 2729 -f 692 2729 2728 -f 2731 691 2733 -f 2732 2733 691 -f 2594 2733 660 -f 2727 660 2733 -f 657 2734 2576 -f 2736 2576 2734 -f 691 2735 2732 -f 2736 2732 2735 -f 692 2728 2737 -f 2738 2737 2728 -f 657 2586 2734 -f 2738 2734 2586 -f 2739 2742 669 -f 2630 669 2742 -f 2741 2742 694 -f 2740 694 2742 -f 2729 692 2744 -f 2743 2744 692 -f 669 2625 2739 -f 2744 2739 2625 -f 656 2745 2587 -f 2746 2587 2745 -f 692 2737 2743 -f 2746 2743 2737 -f 694 2740 2747 -f 2748 2747 2740 -f 656 2582 2745 -f 2748 2745 2582 -f 673 2749 2643 -f 2752 2643 2749 -f 2752 2750 2751 -f 696 2751 2750 -f 2754 2741 2753 -f 694 2753 2741 -f 2639 2754 673 -f 2749 673 2754 -f 2755 2756 655 -f 2584 655 2756 -f 2753 694 2756 -f 2747 2756 694 -f 696 2750 2757 -f 2758 2757 2750 -f 655 2578 2755 -f 2758 2755 2578 -f 2759 2761 667 -f 2608 667 2761 -f 2731 2761 691 -f 2760 691 2761 -f 2763 2751 2762 -f 696 2762 2751 -f 667 2618 2759 -f 2763 2759 2618 -f 654 2764 2580 -f 2765 2580 2764 -f 696 2757 2762 -f 2765 2762 2757 -f 691 2760 2735 -f 2766 2735 2760 -f 654 2573 2764 -f 2766 2764 2573 -f 2767 699 2770 -f 2768 2770 699 -f 2769 482 2770 -f 1883 2770 482 -f 2774 2771 2772 -f 700 2772 2771 -f 699 2773 2768 -f 2774 2768 2773 -f 2778 2775 2776 -f 701 2776 2775 -f 2772 700 2778 -f 2777 2778 700 -f 2780 1888 2769 -f 482 2769 1888 -f 2776 701 2780 -f 2779 2780 701 -f 701 2781 2779 -f 2783 2779 2781 -f 624 2428 2782 -f 2783 2782 2428 -f 2785 2786 703 -f 2784 703 2786 -f 2775 2786 701 -f 2781 701 2786 -f 436 2787 1703 -f 2789 1703 2787 -f 703 2788 2785 -f 2789 2785 2788 -f 2782 2790 624 -f 2431 624 2790 -f 1698 2790 436 -f 2787 436 2790 -f 2791 2793 441 -f 1709 441 2793 -f 2409 2793 620 -f 2792 620 2793 -f 705 2795 2794 -f 2796 2794 2795 -f 441 1718 2791 -f 2796 2791 1718 -f 2797 706 2800 -f 2798 2800 706 -f 2799 2800 705 -f 2795 705 2800 -f 620 2792 2414 -f 2802 2414 2792 -f 706 2801 2798 -f 2802 2798 2801 -f 2803 2805 706 -f 2801 706 2805 -f 2805 2804 1872 -f 479 1872 2804 -f 2807 2808 708 -f 2806 708 2808 -f 2808 2803 2797 -f 706 2797 2803 -f 699 2809 2773 -f 2811 2773 2809 -f 2811 2807 2810 -f 708 2810 2807 -f 2804 2812 479 -f 1877 479 2812 -f 2812 2809 2767 -f 699 2767 2809 -f 2813 2815 703 -f 2788 703 2815 -f 445 1731 2814 -f 2815 2814 1731 -f 700 2816 2777 -f 2817 2777 2816 -f 703 2784 2813 -f 2817 2813 2784 -f 2819 2820 710 -f 2818 710 2820 -f 2771 2820 700 -f 2816 700 2820 -f 2822 1737 2814 -f 445 2814 1737 -f 710 2821 2819 -f 2822 2819 2821 -f 710 2823 2821 -f 2825 2821 2823 -f 1743 2825 448 -f 2824 448 2825 -f 2826 2827 708 -f 2810 708 2827 -f 2818 2827 710 -f 2823 710 2827 -f 705 2828 2799 -f 2829 2799 2828 -f 708 2806 2826 -f 2829 2826 2806 -f 2824 2830 448 -f 1748 448 2830 -f 2794 2830 705 -f 2828 705 2830 -f 2832 2835 713 -f 2831 713 2835 -f 2834 2835 715 -f 2833 715 2835 -f 2836 714 2839 -f 2837 2839 714 -f 713 2838 2832 -f 2839 2832 2838 -f 715 2833 2840 -f 2842 2840 2833 -f 714 2841 2837 -f 2842 2837 2841 -f 2844 2846 717 -f 2843 717 2846 -f 713 2831 2845 -f 2846 2845 2831 -f 519 2847 2006 -f 2849 2006 2847 -f 2849 2844 2848 -f 717 2848 2844 -f 2850 2851 497 -f 1937 497 2851 -f 2015 2851 519 -f 2847 519 2851 -f 718 2853 2852 -f 2854 2852 2853 -f 497 1932 2850 -f 2854 2850 1932 -f 2845 2856 713 -f 2838 713 2856 -f 2855 2856 718 -f 2853 718 2856 -f 715 2857 2834 -f 2859 2834 2857 -f 717 2843 2858 -f 2859 2858 2843 -f 2861 2862 720 -f 2860 720 2862 -f 2840 2862 715 -f 2857 715 2862 -f 2863 2865 534 -f 2074 534 2865 -f 2864 2865 720 -f 2861 720 2865 -f 545 2866 2115 -f 2867 2115 2866 -f 2863 534 2867 -f 2067 2867 534 -f 2858 2868 717 -f 2848 717 2868 -f 2111 2868 545 -f 2866 545 2868 -f 2869 2872 460 -f 1794 460 2872 -f 2871 2872 722 -f 2870 722 2872 -f 618 2873 2407 -f 2874 2407 2873 -f 2874 2869 1801 -f 460 1801 2869 -f 2864 720 2876 -f 2875 2876 720 -f 2404 2876 618 -f 2873 618 2876 -f 722 2870 2877 -f 2878 2877 2870 -f 720 2860 2875 -f 2878 2875 2860 -f 463 2879 1805 -f 2881 1805 2879 -f 637 2485 2880 -f 2881 2880 2485 -f 2883 2884 724 -f 2882 724 2884 -f 1812 2884 463 -f 2879 463 2884 -f 718 2885 2855 -f 2887 2855 2885 -f 724 2886 2883 -f 2887 2883 2886 -f 2880 2888 637 -f 2490 637 2888 -f 2852 2888 718 -f 2885 718 2888 -f 726 2890 2889 -f 2892 2889 2890 -f 714 2836 2891 -f 2892 2891 2836 -f 2894 2896 727 -f 2893 727 2896 -f 2895 2896 726 -f 2890 726 2896 -f 2898 2900 728 -f 2897 728 2900 -f 2894 727 2900 -f 2899 2900 727 -f 2841 714 2902 -f 2891 2902 714 -f 2902 2898 2901 -f 728 2901 2898 -f 2901 728 2905 -f 2903 2905 728 -f 2877 2905 722 -f 2904 722 2905 -f 730 2907 2906 -f 2908 2906 2907 -f 728 2897 2903 -f 2908 2903 2897 -f 2909 2911 469 -f 1837 469 2911 -f 2910 2911 730 -f 2907 730 2911 -f 722 2904 2871 -f 2912 2871 2904 -f 469 1832 2909 -f 2912 2909 1832 -f 473 2913 1843 -f 2915 1843 2913 -f 2915 2914 2882 -f 724 2882 2914 -f 2917 2918 732 -f 2916 732 2918 -f 1850 2918 473 -f 2913 473 2918 -f 2921 2895 2919 -f 726 2919 2895 -f 732 2920 2917 -f 2921 2917 2920 -f 2914 2922 724 -f 2886 724 2922 -f 2919 726 2922 -f 2889 2922 726 -f 2923 2925 727 -f 2899 727 2925 -f 2906 2925 730 -f 2924 730 2925 -f 2926 2927 732 -f 2920 732 2927 -f 2923 727 2927 -f 2893 2927 727 -f 475 2928 1860 -f 2929 1860 2928 -f 732 2916 2926 -f 2929 2926 2916 -f 730 2924 2910 -f 2930 2910 2924 -f 2930 2928 1856 -f 475 1856 2928 -f 738 6 739 -f 735 739 6 -f 193 737 736 -f 739 736 737 -f 743 742 740 -f 14 740 742 -f 741 193 743 -f 736 743 193 -f 747 746 744 -f 10 744 746 -f 193 741 745 -f 747 745 741 -f 16 748 749 -f 750 749 748 -f 745 750 193 -f 737 193 750 -f 754 735 751 -f 6 751 735 -f 197 753 752 -f 754 752 753 -f 18 755 757 -f 758 757 755 -f 752 758 197 -f 756 197 758 -f 762 761 759 -f 13 759 761 -f 197 756 760 -f 762 760 756 -f 763 14 764 -f 742 764 14 -f 760 764 197 -f 753 197 764 -f 1 765 768 -f 769 768 765 -f 767 769 202 -f 766 202 769 -f 12 770 772 -f 773 772 770 -f 202 766 771 -f 773 771 766 -f 774 777 11 -f 776 11 777 -f 771 777 202 -f 775 202 777 -f 24 778 779 -f 780 779 778 -f 202 775 767 -f 780 767 775 -f 7 781 784 -f 785 784 781 -f 206 783 782 -f 785 782 783 -f 779 788 24 -f 787 24 788 -f 782 788 206 -f 786 206 788 -f 11 789 774 -f 791 774 789 -f 206 786 790 -f 791 790 786 -f 792 794 23 -f 793 23 794 -f 790 794 206 -f 783 206 794 -f 2 795 798 -f 799 798 795 -f 211 797 796 -f 799 796 797 -f 800 803 27 -f 802 27 803 -f 796 803 211 -f 801 211 803 -f 804 807 19 -f 806 19 807 -f 211 801 805 -f 807 805 801 -f 20 808 809 -f 810 809 808 -f 810 797 805 -f 211 805 797 -f 768 814 1 -f 813 1 814 -f 812 814 215 -f 811 215 814 -f 24 815 778 -f 817 778 815 -f 215 811 816 -f 817 816 811 -f 818 821 15 -f 820 15 821 -f 816 821 215 -f 819 215 821 -f 16 822 823 -f 824 823 822 -f 215 819 812 -f 824 812 819 -f 828 827 738 -f 6 738 827 -f 218 826 825 -f 828 825 826 -f 16 823 748 -f 830 748 823 -f 825 830 218 -f 829 218 830 -f 15 831 818 -f 833 818 831 -f 218 829 832 -f 833 832 829 -f 834 836 32 -f 835 32 836 -f 832 836 218 -f 826 218 836 -f 841 840 837 -f 5 837 840 -f 838 222 841 -f 839 841 222 -f 32 835 843 -f 844 843 835 -f 844 842 838 -f 222 838 842 -f 831 15 847 -f 845 847 15 -f 842 847 222 -f 846 222 847 -f 849 30 850 -f 848 850 30 -f 222 846 839 -f 850 839 846 -f 851 854 7 -f 781 7 854 -f 853 854 224 -f 852 224 854 -f 857 856 849 -f 30 849 856 -f 855 224 857 -f 852 857 224 -f 15 820 845 -f 859 845 820 -f 859 858 855 -f 224 855 858 -f 24 787 815 -f 860 815 787 -f 858 860 224 -f 853 224 860 -f 861 864 2 -f 795 2 864 -f 863 864 228 -f 862 228 864 -f 18 865 867 -f 868 867 865 -f 228 862 866 -f 868 866 862 -f 869 872 17 -f 871 17 872 -f 866 872 228 -f 870 228 872 -f 27 802 873 -f 874 873 802 -f 228 870 863 -f 874 863 870 -f 879 878 875 -f 8 875 878 -f 232 877 876 -f 879 876 877 -f 873 882 27 -f 881 27 882 -f 876 882 232 -f 880 232 882 -f 17 883 869 -f 885 869 883 -f 232 880 884 -f 885 884 880 -f 887 29 888 -f 886 888 29 -f 884 888 232 -f 877 232 888 -f 837 5 892 -f 889 892 5 -f 891 892 235 -f 890 235 892 -f 29 887 894 -f 895 894 887 -f 235 890 893 -f 895 893 890 -f 896 898 17 -f 883 17 898 -f 893 898 235 -f 897 235 898 -f 899 32 900 -f 843 900 32 -f 235 897 891 -f 900 891 897 -f 751 6 903 -f 827 903 6 -f 236 902 901 -f 903 901 902 -f 32 899 834 -f 905 834 899 -f 901 905 236 -f 904 236 905 -f 17 871 896 -f 907 896 871 -f 236 904 906 -f 907 906 904 -f 18 757 865 -f 908 865 757 -f 906 908 236 -f 902 236 908 -f 913 912 909 -f 3 909 912 -f 241 911 910 -f 913 910 911 -f 22 914 916 -f 917 916 914 -f 915 241 917 -f 910 917 241 -f 21 918 920 -f 921 920 918 -f 921 919 915 -f 241 915 919 -f 31 922 923 -f 924 923 922 -f 919 924 241 -f 911 241 924 -f 925 929 9 -f 928 9 929 -f 245 927 926 -f 929 926 927 -f 923 932 31 -f 931 31 932 -f 926 932 245 -f 930 245 932 -f 21 933 918 -f 935 918 933 -f 245 930 934 -f 935 934 930 -f 938 937 936 -f 33 936 937 -f 934 938 245 -f 927 245 938 -f 939 943 4 -f 942 4 943 -f 941 943 250 -f 940 250 943 -f 28 944 946 -f 947 946 944 -f 250 940 945 -f 947 945 940 -f 948 951 25 -f 950 25 951 -f 945 951 250 -f 949 250 951 -f 26 952 953 -f 954 953 952 -f 954 941 949 -f 250 949 941 -f 9 928 957 -f 958 957 928 -f 253 956 955 -f 958 955 956 -f 959 961 33 -f 936 33 961 -f 955 961 253 -f 960 253 961 -f 25 950 963 -f 964 963 950 -f 253 960 962 -f 964 962 960 -f 965 966 28 -f 944 28 966 -f 962 966 253 -f 956 253 966 -f 840 970 5 -f 969 5 970 -f 968 970 256 -f 967 256 970 -f 30 971 848 -f 973 848 971 -f 256 967 972 -f 973 972 967 -f 975 31 976 -f 931 976 31 -f 972 976 256 -f 974 256 976 -f 9 977 925 -f 978 925 977 -f 256 974 968 -f 978 968 974 -f 29 979 886 -f 982 886 979 -f 982 980 981 -f 259 981 980 -f 946 985 28 -f 984 28 985 -f 980 985 259 -f 983 259 985 -f 986 988 4 -f 939 4 988 -f 259 983 987 -f 988 987 983 -f 878 990 8 -f 989 8 990 -f 981 259 990 -f 987 990 259 -f 23 991 792 -f 994 792 991 -f 994 992 993 -f 262 993 992 -f 22 916 996 -f 997 996 916 -f 992 997 262 -f 995 262 997 -f 998 1000 3 -f 909 3 1000 -f 262 995 999 -f 1000 999 995 -f 784 1002 7 -f 1001 7 1002 -f 993 262 1002 -f 999 1002 262 -f 28 984 965 -f 1005 965 984 -f 263 1004 1003 -f 1005 1003 1004 -f 894 1007 29 -f 979 29 1007 -f 1003 1007 263 -f 1006 263 1007 -f 5 969 889 -f 1009 889 969 -f 263 1006 1008 -f 1009 1008 1006 -f 957 1010 9 -f 977 9 1010 -f 1008 1010 263 -f 1004 263 1010 -f 856 1013 30 -f 971 30 1013 -f 1012 1013 264 -f 1011 264 1013 -f 7 1001 851 -f 1015 851 1001 -f 264 1011 1014 -f 1015 1014 1011 -f 912 1017 3 -f 998 3 1017 -f 1014 1017 264 -f 1016 264 1017 -f 31 975 922 -f 1018 922 975 -f 264 1016 1012 -f 1018 1012 1016 -f 23 1019 991 -f 1022 991 1019 -f 1020 268 1022 -f 1021 1022 268 -f 35 1023 1025 -f 1026 1025 1023 -f 1026 1024 1020 -f 268 1020 1024 -f 1029 34 1030 -f 1027 1030 34 -f 1024 1030 268 -f 1028 268 1030 -f 1032 1031 996 -f 22 996 1031 -f 268 1028 1021 -f 1032 1021 1028 -f 1033 1036 35 -f 1023 35 1036 -f 1035 1036 272 -f 1034 272 1036 -f 37 1037 1039 -f 1040 1039 1037 -f 272 1034 1038 -f 1040 1038 1034 -f 1043 36 1044 -f 1041 1044 36 -f 1038 1044 272 -f 1042 272 1044 -f 1046 1045 1029 -f 34 1029 1045 -f 272 1042 1035 -f 1046 1035 1042 -f 35 1047 1033 -f 1050 1033 1047 -f 276 1049 1048 -f 1050 1048 1049 -f 1051 1054 40 -f 1053 40 1054 -f 1048 1054 276 -f 1052 276 1054 -f 41 1055 1057 -f 1058 1057 1055 -f 276 1052 1056 -f 1058 1056 1052 -f 1039 1060 37 -f 1059 37 1060 -f 1056 1060 276 -f 1049 276 1060 -f 37 1059 1063 -f 1064 1063 1059 -f 280 1062 1061 -f 1064 1061 1062 -f 1065 1067 41 -f 1055 41 1067 -f 1061 1067 280 -f 1066 280 1067 -f 1071 1070 1068 -f 42 1068 1070 -f 280 1066 1069 -f 1071 1069 1066 -f 38 1072 1073 -f 1074 1073 1072 -f 1074 1062 1069 -f 280 1069 1062 -f 1079 1078 1075 -f 43 1075 1078 -f 285 1077 1076 -f 1079 1076 1077 -f 1080 1083 48 -f 1082 48 1083 -f 285 1076 1081 -f 1083 1081 1076 -f 1084 1087 45 -f 1086 45 1087 -f 285 1081 1085 -f 1087 1085 1081 -f 1088 1090 46 -f 1089 46 1090 -f 285 1085 1077 -f 1090 1077 1085 -f 1091 1095 44 -f 1094 44 1095 -f 290 1093 1092 -f 1095 1092 1093 -f 1099 1098 1096 -f 50 1096 1098 -f 290 1092 1097 -f 1099 1097 1092 -f 1100 1103 47 -f 1102 47 1103 -f 1097 1103 290 -f 1101 290 1103 -f 1104 1106 49 -f 1105 49 1106 -f 290 1101 1093 -f 1106 1093 1101 -f 18 867 1109 -f 1110 1109 867 -f 1107 293 1110 -f 1108 1110 293 -f 1113 861 1111 -f 2 1111 861 -f 293 1107 1112 -f 1113 1112 1107 -f 1094 1116 44 -f 1115 44 1116 -f 1112 1116 293 -f 1114 293 1116 -f 1117 1118 49 -f 1104 49 1118 -f 293 1114 1108 -f 1118 1108 1114 -f 20 1119 1122 -f 1123 1122 1119 -f 297 1121 1120 -f 1123 1120 1121 -f 13 1124 1126 -f 1127 1126 1124 -f 1120 1127 297 -f 1125 297 1127 -f 1102 1130 47 -f 1129 47 1130 -f 297 1125 1128 -f 1130 1128 1125 -f 1131 1132 50 -f 1096 50 1132 -f 1128 1132 297 -f 1121 297 1132 -f 18 1109 755 -f 1135 755 1109 -f 298 1134 1133 -f 1135 1133 1134 -f 1105 1137 49 -f 1117 49 1137 -f 1133 1137 298 -f 1136 298 1137 -f 1129 1139 47 -f 1100 47 1139 -f 298 1136 1138 -f 1139 1138 1136 -f 13 761 1124 -f 1140 1124 761 -f 1138 1140 298 -f 1134 298 1140 -f 20 1122 808 -f 1143 808 1122 -f 1142 1143 299 -f 1141 299 1143 -f 1098 1145 50 -f 1131 50 1145 -f 299 1141 1144 -f 1145 1144 1141 -f 1115 1147 44 -f 1091 44 1147 -f 1144 1147 299 -f 1146 299 1147 -f 1148 1111 798 -f 2 798 1111 -f 1148 1142 1146 -f 299 1146 1142 -f 16 1149 822 -f 1152 822 1149 -f 1151 1152 302 -f 1150 302 1152 -f 1082 1155 48 -f 1154 48 1155 -f 302 1150 1153 -f 1155 1153 1150 -f 1156 1158 43 -f 1075 43 1158 -f 1153 1158 302 -f 1157 302 1158 -f 1160 1159 813 -f 1 813 1159 -f 302 1157 1151 -f 1160 1151 1157 -f 772 1164 12 -f 1163 12 1164 -f 1161 304 1164 -f 1162 1164 304 -f 1159 1166 1 -f 765 1 1166 -f 1166 1165 1161 -f 304 1161 1165 -f 1078 1168 43 -f 1156 43 1168 -f 1165 1168 304 -f 1167 304 1168 -f 1169 1170 46 -f 1088 46 1170 -f 304 1167 1162 -f 1170 1162 1167 -f 1171 1174 10 -f 744 10 1174 -f 1173 1174 306 -f 1172 306 1174 -f 1086 1177 45 -f 1176 45 1177 -f 306 1172 1175 -f 1177 1175 1172 -f 1154 1179 48 -f 1080 48 1179 -f 1175 1179 306 -f 1178 306 1179 -f 16 749 1149 -f 1180 1149 749 -f 306 1178 1173 -f 1180 1173 1178 -f 12 1163 1183 -f 1184 1183 1163 -f 308 1182 1181 -f 1184 1181 1182 -f 1089 1186 46 -f 1169 46 1186 -f 1181 1186 308 -f 1185 308 1186 -f 1176 1188 45 -f 1084 45 1188 -f 308 1185 1187 -f 1188 1187 1185 -f 10 1189 1171 -f 1190 1171 1189 -f 1187 1190 308 -f 1182 308 1190 -f 38 1191 1072 -f 1194 1072 1191 -f 312 1193 1192 -f 1194 1192 1193 -f 51 1195 1197 -f 1198 1197 1195 -f 312 1192 1196 -f 1198 1196 1192 -f 1201 53 1202 -f 1199 1202 53 -f 312 1196 1200 -f 1202 1200 1196 -f 1205 1204 1043 -f 36 1043 1204 -f 312 1200 1203 -f 1205 1203 1200 -f 1063 1206 37 -f 1037 37 1206 -f 1203 1206 312 -f 1193 312 1206 -f 52 1207 1210 -f 1211 1210 1207 -f 1211 1208 1209 -f 317 1209 1208 -f 1212 1215 53 -f 1214 53 1215 -f 1208 1215 317 -f 1213 317 1215 -f 1216 1219 57 -f 1218 57 1219 -f 1217 317 1219 -f 1213 1219 317 -f 1222 1221 1220 -f 56 1220 1221 -f 317 1217 1209 -f 1222 1209 1217 -f 1225 1212 1201 -f 53 1201 1212 -f 320 1224 1223 -f 1225 1223 1224 -f 51 1226 1195 -f 1228 1195 1226 -f 1227 320 1228 -f 1223 1228 320 -f 1232 1231 1229 -f 54 1229 1231 -f 320 1227 1230 -f 1232 1230 1227 -f 1218 1234 57 -f 1233 57 1234 -f 1230 1234 320 -f 1224 320 1234 -f 1238 1229 1235 -f 54 1235 1229 -f 323 1237 1236 -f 1238 1236 1237 -f 1239 1242 55 -f 1241 55 1242 -f 1236 1242 323 -f 1240 323 1242 -f 1221 1245 56 -f 1244 56 1245 -f 323 1240 1243 -f 1245 1243 1240 -f 1233 1246 57 -f 1216 57 1246 -f 1243 1246 323 -f 1237 323 1246 -f 1247 1251 69 -f 1250 69 1251 -f 1249 1251 327 -f 1248 327 1251 -f 76 1252 1254 -f 1255 1254 1252 -f 327 1248 1253 -f 1255 1253 1248 -f 920 1258 21 -f 1257 21 1258 -f 1253 1258 327 -f 1256 327 1258 -f 22 1259 914 -f 1260 914 1259 -f 327 1256 1249 -f 1260 1249 1256 -f 1264 77 1265 -f 1261 1265 77 -f 1263 1265 331 -f 1262 331 1265 -f 1269 1268 1266 -f 80 1266 1268 -f 331 1262 1267 -f 1269 1267 1262 -f 963 1272 25 -f 1271 25 1272 -f 1270 331 1272 -f 1267 1272 331 -f 33 1273 959 -f 1274 959 1273 -f 331 1270 1263 -f 1274 1263 1270 -f 1266 80 1278 -f 1275 1278 80 -f 1277 1278 334 -f 1276 334 1278 -f 1282 1281 1279 -f 81 1279 1281 -f 334 1276 1280 -f 1282 1280 1276 -f 1284 26 1285 -f 953 1285 26 -f 1280 1285 334 -f 1283 334 1285 -f 25 1271 948 -f 1286 948 1271 -f 1286 1277 1283 -f 334 1283 1277 -f 1287 1291 67 -f 1290 67 1291 -f 1289 1291 338 -f 1288 338 1291 -f 1295 1294 1292 -f 68 1292 1294 -f 338 1288 1293 -f 1295 1293 1288 -f 1297 12 1298 -f 1183 1298 12 -f 1293 1298 338 -f 1296 338 1298 -f 1300 1189 1299 -f 10 1299 1189 -f 338 1296 1289 -f 1300 1289 1296 -f 78 1301 1304 -f 1305 1304 1301 -f 1305 1302 1303 -f 342 1303 1302 -f 1306 1309 74 -f 1308 74 1309 -f 1307 342 1309 -f 1302 1309 342 -f 1312 1311 1126 -f 13 1126 1311 -f 342 1307 1310 -f 1312 1310 1307 -f 1313 1314 20 -f 1119 20 1314 -f 1303 342 1314 -f 1310 1314 342 -f 1315 1318 76 -f 1252 76 1318 -f 1317 1318 344 -f 1316 344 1318 -f 1321 1320 1264 -f 77 1264 1320 -f 344 1316 1319 -f 1321 1319 1316 -f 937 1323 33 -f 1273 33 1323 -f 1322 344 1323 -f 1319 1323 344 -f 21 1257 933 -f 1324 933 1257 -f 344 1322 1317 -f 1324 1317 1322 -f 1328 70 1329 -f 1325 1329 70 -f 1326 347 1329 -f 1327 1329 347 -f 69 1250 1331 -f 1332 1331 1250 -f 347 1326 1330 -f 1332 1330 1326 -f 1031 1334 22 -f 1259 22 1334 -f 1330 1334 347 -f 1333 347 1334 -f 34 1335 1027 -f 1336 1027 1335 -f 347 1333 1327 -f 1336 1327 1333 -f 1340 71 1341 -f 1337 1341 71 -f 1339 1341 350 -f 1338 350 1341 -f 1344 1343 1328 -f 70 1328 1343 -f 350 1338 1342 -f 1344 1342 1338 -f 1045 1346 34 -f 1335 34 1346 -f 1345 350 1346 -f 1342 1346 350 -f 36 1347 1041 -f 1348 1041 1347 -f 1348 1339 1345 -f 350 1345 1339 -f 59 1349 1352 -f 1353 1352 1349 -f 1351 1353 355 -f 1350 355 1353 -f 65 1354 1356 -f 1357 1356 1354 -f 355 1350 1355 -f 1357 1355 1350 -f 1358 1361 39 -f 1360 39 1361 -f 1355 1361 355 -f 1359 355 1361 -f 38 1362 1363 -f 1364 1363 1362 -f 355 1359 1351 -f 1364 1351 1359 -f 1368 60 1369 -f 1365 1369 60 -f 358 1367 1366 -f 1369 1366 1367 -f 1372 1371 1352 -f 59 1352 1371 -f 1370 358 1372 -f 1366 1372 358 -f 38 1073 1362 -f 1374 1362 1073 -f 1374 1373 1370 -f 358 1370 1373 -f 1375 1376 42 -f 1068 42 1376 -f 1373 1376 358 -f 1367 358 1376 -f 1380 79 1381 -f 1377 1381 79 -f 1379 1381 361 -f 1378 361 1381 -f 1383 78 1384 -f 1304 1384 78 -f 361 1378 1382 -f 1384 1382 1378 -f 20 809 1313 -f 1386 1313 809 -f 1385 361 1386 -f 1382 1386 361 -f 19 1387 804 -f 1388 804 1387 -f 1388 1379 1385 -f 361 1385 1379 -f 68 1389 1292 -f 1392 1292 1389 -f 364 1391 1390 -f 1392 1390 1391 -f 1393 1396 58 -f 1395 58 1396 -f 1394 364 1396 -f 1390 1396 364 -f 11 776 1398 -f 1399 1398 776 -f 364 1394 1397 -f 1399 1397 1394 -f 770 12 1400 -f 1297 1400 12 -f 1397 1400 364 -f 1391 364 1400 -f 1404 1393 1401 -f 58 1401 1393 -f 367 1403 1402 -f 1404 1402 1403 -f 1405 1408 61 -f 1407 61 1408 -f 1406 367 1408 -f 1402 1408 367 -f 23 793 1410 -f 1411 1410 793 -f 367 1406 1409 -f 1411 1409 1406 -f 1398 1412 11 -f 789 11 1412 -f 1409 1412 367 -f 1403 367 1412 -f 1413 1416 61 -f 1405 61 1416 -f 370 1415 1414 -f 1416 1414 1415 -f 1420 1419 1417 -f 62 1417 1419 -f 370 1414 1418 -f 1420 1418 1414 -f 35 1025 1422 -f 1423 1422 1025 -f 1421 370 1423 -f 1418 1423 370 -f 1410 1424 23 -f 1019 23 1424 -f 1421 1424 370 -f 1415 370 1424 -f 1425 1428 62 -f 1417 62 1428 -f 1427 1428 373 -f 1426 373 1428 -f 1429 1432 63 -f 1431 63 1432 -f 373 1426 1430 -f 1432 1430 1426 -f 1435 1434 1053 -f 40 1053 1434 -f 1433 373 1435 -f 1430 1435 373 -f 35 1422 1047 -f 1436 1047 1422 -f 1436 1427 1433 -f 373 1433 1427 -f 1440 1429 1437 -f 63 1437 1429 -f 376 1439 1438 -f 1440 1438 1439 -f 1441 1444 64 -f 1443 64 1444 -f 1438 1444 376 -f 1442 376 1444 -f 41 1057 1446 -f 1447 1446 1057 -f 376 1442 1445 -f 1447 1445 1442 -f 1434 1448 40 -f 1051 40 1448 -f 1445 1448 376 -f 1439 376 1448 -f 1452 1441 1449 -f 64 1449 1441 -f 1451 1452 378 -f 1450 378 1452 -f 1455 1454 1368 -f 60 1368 1454 -f 378 1450 1453 -f 1455 1453 1450 -f 1070 1457 42 -f 1375 42 1457 -f 1453 1457 378 -f 1456 378 1457 -f 41 1446 1065 -f 1458 1065 1446 -f 1458 1451 1456 -f 378 1456 1451 -f 1462 1461 1340 -f 71 1340 1461 -f 381 1460 1459 -f 1462 1459 1460 -f 1347 36 1464 -f 1204 1464 36 -f 381 1459 1463 -f 1464 1463 1459 -f 53 1214 1199 -f 1466 1199 1214 -f 381 1463 1465 -f 1466 1465 1463 -f 1467 1469 52 -f 1207 52 1469 -f 381 1465 1468 -f 1469 1468 1465 -f 1470 1472 72 -f 1471 72 1472 -f 381 1468 1460 -f 1472 1460 1468 -f 38 1363 1191 -f 1475 1191 1363 -f 1475 1473 1474 -f 383 1474 1473 -f 39 1476 1358 -f 1478 1358 1476 -f 1478 1477 1473 -f 383 1473 1477 -f 1197 1480 51 -f 1479 51 1480 -f 1477 1480 383 -f 1474 383 1480 -f 1485 1484 1481 -f 85 1481 1484 -f 1483 1485 388 -f 1482 388 1485 -f 1489 1488 1486 -f 83 1486 1488 -f 388 1482 1487 -f 1489 1487 1482 -f 1490 1493 84 -f 1492 84 1493 -f 1487 1493 388 -f 1491 388 1493 -f 1496 1495 1494 -f 82 1494 1495 -f 388 1491 1483 -f 1496 1483 1491 -f 1497 1501 92 -f 1500 92 1501 -f 1499 1501 393 -f 1498 393 1501 -f 1505 1504 1502 -f 89 1502 1504 -f 393 1498 1503 -f 1505 1503 1498 -f 1509 1508 1506 -f 88 1506 1508 -f 1507 393 1509 -f 1503 1509 393 -f 93 1510 1511 -f 1512 1511 1510 -f 1512 1499 1507 -f 393 1507 1499 -f 93 1513 1516 -f 1517 1516 1513 -f 1517 1514 1515 -f 398 1515 1514 -f 1521 1520 1518 -f 86 1518 1520 -f 1514 1521 398 -f 1519 398 1521 -f 1525 1524 1522 -f 87 1522 1524 -f 398 1519 1523 -f 1525 1523 1519 -f 1526 1528 94 -f 1527 94 1528 -f 1515 398 1528 -f 1523 1528 398 -f 89 1529 1502 -f 1532 1502 1529 -f 1530 402 1532 -f 1531 1532 402 -f 1535 90 1536 -f 1533 1536 90 -f 1530 1536 402 -f 1534 402 1536 -f 1539 91 1540 -f 1537 1540 91 -f 1534 1540 402 -f 1538 402 1540 -f 1542 1541 1508 -f 88 1508 1541 -f 402 1538 1531 -f 1542 1531 1538 -f 1543 1546 90 -f 1533 90 1546 -f 1544 405 1546 -f 1545 1546 405 -f 1524 1549 87 -f 1548 87 1549 -f 1547 405 1549 -f 1544 1549 405 -f 1518 86 1552 -f 1550 1552 86 -f 405 1547 1551 -f 1552 1551 1547 -f 1554 1553 1539 -f 91 1539 1553 -f 1545 405 1554 -f 1551 1554 405 -f 92 1500 1557 -f 1558 1557 1500 -f 408 1556 1555 -f 1558 1555 1556 -f 93 1516 1510 -f 1560 1510 1516 -f 1555 1560 408 -f 1559 408 1560 -f 1561 1563 94 -f 1526 94 1563 -f 1562 408 1563 -f 1559 1563 408 -f 95 1564 1565 -f 1566 1565 1564 -f 408 1562 1556 -f 1566 1556 1562 -f 1570 1569 1557 -f 92 1557 1569 -f 411 1568 1567 -f 1570 1567 1568 -f 1571 1573 95 -f 1564 95 1573 -f 411 1567 1572 -f 1573 1572 1567 -f 55 1241 1575 -f 1576 1575 1241 -f 411 1572 1574 -f 1576 1574 1572 -f 1231 1578 54 -f 1235 54 1578 -f 1574 1578 411 -f 1577 411 1578 -f 51 1579 1226 -f 1580 1226 1579 -f 411 1577 1568 -f 1580 1568 1577 -f 94 1581 1561 -f 1584 1561 1581 -f 1584 1582 1583 -f 413 1583 1582 -f 1586 52 1587 -f 1210 1587 52 -f 1585 413 1587 -f 1582 1587 413 -f 1244 1589 56 -f 1220 56 1589 -f 413 1585 1588 -f 1589 1588 1585 -f 1575 1591 55 -f 1239 55 1591 -f 413 1588 1590 -f 1591 1590 1588 -f 1571 95 1592 -f 1565 1592 95 -f 1590 1592 413 -f 1583 413 1592 -f 1593 1596 87 -f 1522 87 1596 -f 416 1595 1594 -f 1596 1594 1595 -f 1597 1600 73 -f 1599 73 1600 -f 416 1594 1598 -f 1600 1598 1594 -f 72 1471 1602 -f 1603 1602 1471 -f 416 1598 1601 -f 1603 1601 1598 -f 1605 1467 1586 -f 52 1586 1467 -f 416 1601 1604 -f 1605 1604 1601 -f 94 1527 1581 -f 1606 1581 1527 -f 1606 1595 1604 -f 416 1604 1595 -f 1611 1610 1607 -f 66 1607 1610 -f 420 1609 1608 -f 1611 1608 1609 -f 1614 1613 1535 -f 90 1535 1613 -f 420 1608 1612 -f 1614 1612 1608 -f 1615 1617 89 -f 1529 89 1617 -f 420 1612 1616 -f 1617 1616 1612 -f 39 1360 1619 -f 1620 1619 1360 -f 420 1616 1618 -f 1620 1618 1616 -f 1621 1622 65 -f 1354 65 1622 -f 1618 1622 420 -f 1609 420 1622 -f 73 1599 1625 -f 1626 1625 1599 -f 1626 1623 1624 -f 422 1624 1623 -f 87 1548 1593 -f 1628 1593 1548 -f 422 1623 1627 -f 1628 1627 1623 -f 1630 1543 1613 -f 90 1613 1543 -f 422 1627 1629 -f 1630 1629 1627 -f 66 1631 1607 -f 1632 1607 1631 -f 1624 422 1632 -f 1629 1632 422 -f 1619 1635 39 -f 1476 39 1635 -f 1634 1635 423 -f 1633 423 1635 -f 1637 1615 1504 -f 89 1504 1615 -f 423 1633 1636 -f 1637 1636 1633 -f 92 1569 1497 -f 1639 1497 1569 -f 423 1636 1638 -f 1639 1638 1636 -f 51 1479 1579 -f 1640 1579 1479 -f 423 1638 1634 -f 1640 1634 1638 -f 1506 88 1644 -f 1641 1644 88 -f 1643 1644 426 -f 1642 426 1644 -f 1488 1647 83 -f 1646 83 1647 -f 1642 1647 426 -f 1645 426 1647 -f 1648 1650 85 -f 1481 85 1650 -f 1649 426 1650 -f 1645 1650 426 -f 93 1511 1651 -f 1652 1651 1511 -f 426 1649 1643 -f 1652 1643 1649 -f 91 1653 1537 -f 1656 1537 1653 -f 1656 1654 1655 -f 428 1655 1654 -f 1492 1659 84 -f 1658 84 1659 -f 1654 1659 428 -f 1657 428 1659 -f 1646 1661 83 -f 1486 83 1661 -f 1657 1661 428 -f 1660 428 1661 -f 1541 1662 88 -f 1641 88 1662 -f 1662 1655 1660 -f 428 1660 1655 -f 86 1663 1550 -f 1666 1550 1663 -f 1665 1666 430 -f 1664 430 1666 -f 1668 82 1669 -f 1495 1669 82 -f 1664 1669 430 -f 1667 430 1669 -f 1658 1671 84 -f 1490 84 1671 -f 1670 430 1671 -f 1667 1671 430 -f 91 1553 1653 -f 1672 1653 1553 -f 1672 1665 1670 -f 430 1670 1665 -f 93 1651 1513 -f 1675 1513 1651 -f 431 1674 1673 -f 1675 1673 1674 -f 1484 1677 85 -f 1648 85 1677 -f 1673 1677 431 -f 1676 431 1677 -f 1668 1679 82 -f 1494 82 1679 -f 1678 431 1679 -f 1676 1679 431 -f 1520 1680 86 -f 1663 86 1680 -f 1674 431 1680 -f 1678 1680 431 -f 14 763 1683 -f 1684 1683 763 -f 1684 1681 1682 -f 435 1682 1681 -f 1687 759 1685 -f 13 1685 759 -f 435 1681 1686 -f 1687 1686 1681 -f 1688 1691 97 -f 1690 97 1691 -f 1689 435 1691 -f 1686 1691 435 -f 1692 1694 98 -f 1693 98 1694 -f 1682 435 1694 -f 1689 1694 435 -f 1685 13 1697 -f 1311 1697 13 -f 1696 1697 438 -f 1695 438 1697 -f 1700 1306 1698 -f 74 1698 1306 -f 438 1695 1699 -f 1700 1699 1695 -f 1701 1704 100 -f 1703 100 1704 -f 1699 1704 438 -f 1702 438 1704 -f 97 1690 1705 -f 1706 1705 1690 -f 438 1702 1696 -f 1706 1696 1702 -f 67 1290 1709 -f 1710 1709 1290 -f 442 1708 1707 -f 1710 1707 1708 -f 1711 1713 10 -f 1299 10 1713 -f 1707 1713 442 -f 1712 442 1713 -f 96 1714 1716 -f 1717 1716 1714 -f 442 1712 1715 -f 1717 1715 1712 -f 1718 1720 99 -f 1719 99 1720 -f 1715 1720 442 -f 1708 442 1720 -f 10 746 1711 -f 1723 1711 746 -f 1721 444 1723 -f 1722 1723 444 -f 740 14 1725 -f 1683 1725 14 -f 1725 1724 1721 -f 444 1721 1724 -f 1692 98 1728 -f 1726 1728 98 -f 1724 1728 444 -f 1727 444 1728 -f 1729 96 1730 -f 1716 1730 96 -f 444 1727 1722 -f 1730 1722 1727 -f 1734 1701 1731 -f 100 1731 1701 -f 447 1733 1732 -f 1734 1732 1733 -f 75 1735 1737 -f 1738 1737 1735 -f 1732 1738 447 -f 1736 447 1738 -f 98 1693 1740 -f 1741 1740 1693 -f 447 1736 1739 -f 1741 1739 1736 -f 1688 97 1742 -f 1705 1742 97 -f 1739 1742 447 -f 1733 447 1742 -f 75 1743 1735 -f 1746 1735 1743 -f 1745 1746 449 -f 1744 449 1746 -f 1749 1748 1719 -f 99 1719 1748 -f 449 1744 1747 -f 1749 1747 1744 -f 1729 1751 96 -f 1714 96 1751 -f 1747 1751 449 -f 1750 449 1751 -f 98 1740 1726 -f 1752 1726 1740 -f 449 1750 1745 -f 1752 1745 1750 -f 1757 1756 1753 -f 101 1753 1756 -f 1757 1754 1755 -f 453 1755 1754 -f 1758 1761 102 -f 1760 102 1761 -f 1754 1761 453 -f 1759 453 1761 -f 1762 1764 103 -f 1763 103 1764 -f 1759 1764 453 -f 1755 453 1764 -f 1768 1767 1756 -f 101 1756 1767 -f 456 1766 1765 -f 1768 1765 1766 -f 103 1769 1762 -f 1771 1762 1769 -f 456 1765 1770 -f 1771 1770 1765 -f 806 1774 19 -f 1773 19 1774 -f 1770 1774 456 -f 1772 456 1774 -f 27 881 800 -f 1776 800 881 -f 456 1772 1775 -f 1776 1775 1772 -f 875 8 1778 -f 1777 1778 8 -f 456 1775 1766 -f 1778 1766 1775 -f 1767 1781 101 -f 1753 101 1781 -f 458 1780 1779 -f 1781 1779 1780 -f 8 989 1777 -f 1783 1777 989 -f 458 1779 1782 -f 1783 1782 1779 -f 1785 986 942 -f 4 942 986 -f 458 1782 1784 -f 1785 1784 1782 -f 26 1786 952 -f 1788 952 1786 -f 458 1784 1787 -f 1788 1787 1784 -f 102 1760 1789 -f 1790 1789 1760 -f 458 1787 1780 -f 1790 1780 1787 -f 1795 1794 1791 -f 104 1791 1794 -f 461 1793 1792 -f 1795 1792 1793 -f 1789 1798 102 -f 1797 102 1798 -f 1792 1798 461 -f 1796 461 1798 -f 1786 26 1800 -f 1284 1800 26 -f 1800 1799 1796 -f 461 1796 1799 -f 1279 81 1802 -f 1801 1802 81 -f 1799 1802 461 -f 1793 461 1802 -f 1805 79 1806 -f 1380 1806 79 -f 1804 1806 464 -f 1803 464 1806 -f 19 1773 1387 -f 1808 1387 1773 -f 464 1803 1807 -f 1808 1807 1803 -f 1809 1811 103 -f 1769 103 1811 -f 1807 1811 464 -f 1810 464 1811 -f 1814 1813 1812 -f 105 1812 1813 -f 464 1810 1804 -f 1814 1804 1810 -f 1763 1818 103 -f 1817 103 1818 -f 1815 468 1818 -f 1816 1818 468 -f 102 1819 1758 -f 1821 1758 1819 -f 1821 1820 1815 -f 468 1815 1820 -f 1825 1824 1822 -f 106 1822 1824 -f 468 1820 1823 -f 1825 1823 1820 -f 1828 1827 1826 -f 107 1826 1827 -f 1828 1816 1823 -f 468 1823 1816 -f 102 1797 1819 -f 1831 1819 1797 -f 471 1830 1829 -f 1831 1829 1830 -f 1832 1834 104 -f 1791 104 1834 -f 1829 1834 471 -f 1833 471 1834 -f 108 1835 1837 -f 1838 1837 1835 -f 471 1833 1836 -f 1838 1836 1833 -f 1824 1840 106 -f 1839 106 1840 -f 1836 1840 471 -f 1830 471 1840 -f 1843 105 1844 -f 1813 1844 105 -f 1842 1844 474 -f 1841 474 1844 -f 1846 1809 1817 -f 103 1817 1809 -f 474 1841 1845 -f 1846 1845 1841 -f 1847 1849 107 -f 1826 107 1849 -f 1848 474 1849 -f 1845 1849 474 -f 109 1850 1851 -f 1852 1851 1850 -f 1852 1842 1848 -f 474 1848 1842 -f 1855 1822 1839 -f 106 1839 1822 -f 476 1854 1853 -f 1855 1853 1854 -f 1856 1858 108 -f 1835 108 1858 -f 1853 1858 476 -f 1857 476 1858 -f 1851 1861 109 -f 1860 109 1861 -f 1857 1861 476 -f 1859 476 1861 -f 1862 1847 1827 -f 107 1827 1847 -f 476 1859 1854 -f 1862 1854 1859 -f 1863 1867 115 -f 1866 115 1867 -f 481 1865 1864 -f 1867 1864 1865 -f 125 1868 1870 -f 1871 1870 1868 -f 1869 481 1871 -f 1864 1871 481 -f 1875 1874 1872 -f 119 1872 1874 -f 481 1869 1873 -f 1875 1873 1869 -f 1878 1877 1876 -f 123 1876 1877 -f 1873 1878 481 -f 1865 481 1878 -f 1882 1881 1866 -f 115 1866 1881 -f 485 1880 1879 -f 1882 1879 1880 -f 1883 1885 123 -f 1876 123 1885 -f 1884 485 1885 -f 1879 1885 485 -f 1889 1888 1886 -f 122 1886 1888 -f 485 1884 1887 -f 1889 1887 1884 -f 127 1890 1891 -f 1892 1891 1890 -f 1887 1892 485 -f 1880 485 1892 -f 110 1893 1896 -f 1897 1896 1893 -f 1895 1897 490 -f 1894 490 1897 -f 133 1898 1900 -f 1901 1900 1898 -f 490 1894 1899 -f 1901 1899 1894 -f 1902 1905 120 -f 1904 120 1905 -f 1899 1905 490 -f 1903 490 1905 -f 121 1906 1907 -f 1908 1907 1906 -f 490 1903 1895 -f 1908 1895 1903 -f 116 1909 1912 -f 1913 1912 1909 -f 494 1911 1910 -f 1913 1910 1911 -f 1914 1917 132 -f 1916 132 1917 -f 1910 1917 494 -f 1915 494 1917 -f 120 1904 1919 -f 1920 1919 1904 -f 494 1915 1918 -f 1920 1918 1915 -f 1921 1922 133 -f 1898 133 1922 -f 1918 1922 494 -f 1911 494 1922 -f 111 1923 1926 -f 1927 1926 1923 -f 499 1925 1924 -f 1927 1924 1925 -f 129 1928 1930 -f 1931 1930 1928 -f 1931 1929 1924 -f 499 1924 1929 -f 1935 1934 1932 -f 128 1932 1934 -f 499 1929 1933 -f 1935 1933 1929 -f 1936 1938 136 -f 1937 136 1938 -f 1933 1938 499 -f 1925 499 1938 -f 1939 1942 110 -f 1893 110 1942 -f 1941 1942 503 -f 1940 503 1942 -f 125 1943 1945 -f 1946 1945 1943 -f 503 1940 1944 -f 1946 1944 1940 -f 1947 1950 124 -f 1949 124 1950 -f 1944 1950 503 -f 1948 503 1950 -f 133 1900 1951 -f 1952 1951 1900 -f 503 1948 1941 -f 1952 1941 1948 -f 1956 1863 1953 -f 115 1953 1863 -f 506 1955 1954 -f 1956 1954 1955 -f 1957 1960 141 -f 1959 141 1960 -f 1954 1960 506 -f 1958 506 1960 -f 124 1949 1962 -f 1963 1962 1949 -f 506 1958 1961 -f 1963 1961 1958 -f 125 1870 1943 -f 1964 1943 1870 -f 1961 1964 506 -f 1955 506 1964 -f 1969 1968 1965 -f 114 1965 1968 -f 1967 1969 510 -f 1966 510 1969 -f 1970 1973 139 -f 1972 139 1973 -f 510 1966 1971 -f 1973 1971 1966 -f 1962 1976 124 -f 1975 124 1976 -f 1974 510 1976 -f 1971 1976 510 -f 141 1977 1957 -f 1978 1957 1977 -f 1978 1967 1974 -f 510 1974 1967 -f 1912 1982 116 -f 1981 116 1982 -f 1979 512 1982 -f 1980 1982 512 -f 133 1951 1921 -f 1984 1921 1951 -f 1983 512 1984 -f 1979 1984 512 -f 124 1975 1947 -f 1986 1947 1975 -f 1986 1985 1983 -f 512 1983 1985 -f 1988 1970 1987 -f 139 1987 1970 -f 1985 1988 512 -f 1980 512 1988 -f 1926 1992 111 -f 1991 111 1992 -f 1990 1992 516 -f 1989 516 1992 -f 136 1993 1936 -f 1995 1936 1993 -f 516 1989 1994 -f 1995 1994 1989 -f 1996 1999 126 -f 1998 126 1999 -f 1994 1999 516 -f 1997 516 1999 -f 127 2000 2001 -f 2002 2001 2000 -f 516 1997 1990 -f 2002 1990 1997 -f 2007 2006 2003 -f 117 2003 2006 -f 520 2005 2004 -f 2007 2004 2005 -f 2008 2011 138 -f 2010 138 2011 -f 2009 520 2011 -f 2004 2011 520 -f 126 1998 2013 -f 2014 2013 1998 -f 520 2009 2012 -f 2014 2012 2009 -f 2015 2016 136 -f 1993 136 2016 -f 2012 2016 520 -f 2005 520 2016 -f 1968 2020 114 -f 2019 114 2020 -f 2017 523 2020 -f 2018 2020 523 -f 2021 2023 141 -f 1977 141 2023 -f 523 2017 2022 -f 2023 2022 2017 -f 2013 2026 126 -f 2025 126 2026 -f 2022 2026 523 -f 2024 523 2026 -f 138 2027 2008 -f 2028 2008 2027 -f 523 2024 2018 -f 2028 2018 2024 -f 1881 2031 115 -f 1953 115 2031 -f 524 2030 2029 -f 2031 2029 2030 -f 127 2001 1890 -f 2033 1890 2001 -f 2032 524 2033 -f 2029 2033 524 -f 126 2025 1996 -f 2035 1996 2025 -f 524 2032 2034 -f 2035 2034 2032 -f 141 1959 2021 -f 2036 2021 1959 -f 2034 2036 524 -f 2030 524 2036 -f 2041 2040 2037 -f 112 2037 2040 -f 529 2039 2038 -f 2041 2038 2039 -f 140 2042 2044 -f 2045 2044 2042 -f 2043 529 2045 -f 2038 2045 529 -f 130 2046 2048 -f 2049 2048 2046 -f 2049 2047 2043 -f 529 2043 2047 -f 131 2050 2051 -f 2052 2051 2050 -f 2047 2052 529 -f 2039 529 2052 -f 2056 118 2057 -f 2053 2057 118 -f 533 2055 2054 -f 2057 2054 2055 -f 2061 2060 2058 -f 142 2058 2060 -f 2054 2061 533 -f 2059 533 2061 -f 130 2048 2063 -f 2064 2063 2048 -f 533 2059 2062 -f 2064 2062 2059 -f 2065 2066 140 -f 2042 140 2066 -f 2062 2066 533 -f 2055 533 2066 -f 2067 2071 113 -f 2070 113 2071 -f 2069 2071 538 -f 2068 538 2071 -f 135 2072 2074 -f 2075 2074 2072 -f 2075 2073 2068 -f 538 2068 2073 -f 2076 2079 134 -f 2078 134 2079 -f 2073 2079 538 -f 2077 538 2079 -f 137 2080 2081 -f 2082 2081 2080 -f 538 2077 2069 -f 2082 2069 2077 -f 118 2083 2053 -f 2086 2053 2083 -f 541 2085 2084 -f 2086 2084 2085 -f 2081 2089 137 -f 2088 137 2089 -f 2084 2089 541 -f 2087 541 2089 -f 134 2090 2076 -f 2092 2076 2090 -f 541 2087 2091 -f 2092 2091 2087 -f 2060 2094 142 -f 2093 142 2094 -f 2091 2094 541 -f 2085 541 2094 -f 2095 2098 114 -f 1965 114 2098 -f 2097 2098 544 -f 2096 544 2098 -f 118 2056 2100 -f 2101 2100 2056 -f 544 2096 2099 -f 2101 2099 2096 -f 2102 2104 140 -f 2065 140 2104 -f 2099 2104 544 -f 2103 544 2104 -f 139 1972 2105 -f 2106 2105 1972 -f 544 2103 2097 -f 2106 2097 2103 -f 138 2010 2109 -f 2110 2109 2010 -f 2110 2107 2108 -f 547 2108 2107 -f 2111 2113 117 -f 2003 117 2113 -f 2107 2113 547 -f 2112 547 2113 -f 2070 2116 113 -f 2115 113 2116 -f 547 2112 2114 -f 2116 2114 2112 -f 2117 2118 137 -f 2080 137 2118 -f 2108 547 2118 -f 2114 2118 547 -f 132 1916 2121 -f 2122 2121 1916 -f 2122 2119 2120 -f 550 2120 2119 -f 2123 2125 116 -f 1909 116 2125 -f 2119 2125 550 -f 2124 550 2125 -f 2128 2127 2040 -f 112 2040 2127 -f 550 2124 2126 -f 2128 2126 2124 -f 131 2129 2050 -f 2130 2050 2129 -f 2120 550 2130 -f 2126 2130 550 -f 137 2088 2117 -f 2133 2117 2088 -f 551 2132 2131 -f 2133 2131 2132 -f 2100 2135 118 -f 2083 118 2135 -f 2131 2135 551 -f 2134 551 2135 -f 114 2019 2095 -f 2137 2095 2019 -f 551 2134 2136 -f 2137 2136 2134 -f 2109 2138 138 -f 2027 138 2138 -f 2136 2138 551 -f 2132 551 2138 -f 2105 2141 139 -f 1987 139 2141 -f 2140 2141 552 -f 2139 552 2141 -f 140 2044 2102 -f 2143 2102 2044 -f 552 2139 2142 -f 2143 2142 2139 -f 2127 2145 112 -f 2037 112 2145 -f 2142 2145 552 -f 2144 552 2145 -f 116 1981 2123 -f 2146 2123 1981 -f 552 2144 2140 -f 2146 2140 2144 -f 132 2121 2149 -f 2150 2149 2121 -f 2148 2150 556 -f 2147 556 2150 -f 2153 2129 2151 -f 131 2151 2129 -f 556 2147 2152 -f 2153 2152 2147 -f 2154 2157 143 -f 2156 143 2157 -f 2155 556 2157 -f 2152 2157 556 -f 144 2158 2159 -f 2160 2159 2158 -f 2160 2148 2155 -f 556 2155 2148 -f 2159 2164 144 -f 2163 144 2164 -f 2162 2164 560 -f 2161 560 2164 -f 2167 2154 2165 -f 143 2165 2154 -f 560 2161 2166 -f 2167 2166 2161 -f 2168 2171 145 -f 2170 145 2171 -f 2169 560 2171 -f 2166 2171 560 -f 146 2172 2173 -f 2174 2173 2172 -f 560 2169 2162 -f 2174 2162 2169 -f 144 2163 2177 -f 2178 2177 2163 -f 564 2176 2175 -f 2178 2175 2176 -f 2179 2181 146 -f 2172 146 2181 -f 2175 2181 564 -f 2180 564 2181 -f 150 2182 2184 -f 2185 2184 2182 -f 564 2180 2183 -f 2185 2183 2180 -f 2186 2188 149 -f 2187 149 2188 -f 2183 2188 564 -f 2176 564 2188 -f 146 2189 2179 -f 2192 2179 2189 -f 568 2191 2190 -f 2192 2190 2191 -f 147 2193 2195 -f 2196 2195 2193 -f 2190 2196 568 -f 2194 568 2196 -f 2200 2199 2197 -f 151 2197 2199 -f 568 2194 2198 -f 2200 2198 2194 -f 2184 2202 150 -f 2201 150 2202 -f 2198 2202 568 -f 2191 568 2202 -f 2207 2206 2203 -f 152 2203 2206 -f 573 2205 2204 -f 2207 2204 2205 -f 2208 2211 155 -f 2210 155 2211 -f 573 2204 2209 -f 2211 2209 2204 -f 2212 2215 154 -f 2214 154 2215 -f 573 2209 2213 -f 2215 2213 2209 -f 2216 2218 157 -f 2217 157 2218 -f 573 2213 2205 -f 2218 2205 2213 -f 2223 2222 2219 -f 153 2219 2222 -f 578 2221 2220 -f 2223 2220 2221 -f 2224 2227 158 -f 2226 158 2227 -f 578 2220 2225 -f 2227 2225 2220 -f 2228 2231 156 -f 2230 156 2231 -f 2225 2231 578 -f 2229 578 2231 -f 2232 2234 159 -f 2233 159 2234 -f 578 2229 2221 -f 2234 2221 2229 -f 127 2235 2000 -f 2238 2000 2235 -f 2237 2238 581 -f 2236 581 2238 -f 2226 2241 158 -f 2240 158 2241 -f 581 2236 2239 -f 2241 2239 2236 -f 2242 2244 153 -f 2219 153 2244 -f 2239 2244 581 -f 2243 581 2244 -f 2246 2245 1991 -f 111 1991 2245 -f 581 2243 2237 -f 2246 2237 2243 -f 129 2247 2250 -f 2251 2250 2247 -f 585 2249 2248 -f 2251 2248 2249 -f 2233 2254 159 -f 2253 159 2254 -f 2248 2254 585 -f 2252 585 2254 -f 2255 2257 156 -f 2228 156 2257 -f 585 2252 2256 -f 2257 2256 2252 -f 122 2258 2259 -f 2260 2259 2258 -f 2256 2260 585 -f 2249 585 2260 -f 127 1891 2235 -f 2263 2235 1891 -f 586 2262 2261 -f 2263 2261 2262 -f 122 2259 1886 -f 2265 1886 2259 -f 2261 2265 586 -f 2264 586 2265 -f 2230 2267 156 -f 2255 156 2267 -f 586 2264 2266 -f 2267 2266 2264 -f 2240 2268 158 -f 2224 158 2268 -f 2266 2268 586 -f 2262 586 2268 -f 129 1930 2247 -f 2271 2247 1930 -f 2269 587 2271 -f 2270 2271 587 -f 2273 1923 2245 -f 111 2245 1923 -f 2273 2272 2269 -f 587 2269 2272 -f 2222 2275 153 -f 2242 153 2275 -f 2272 2275 587 -f 2274 587 2275 -f 2253 2276 159 -f 2232 159 2276 -f 587 2274 2270 -f 2276 2270 2274 -f 125 1945 2279 -f 2280 2279 1945 -f 2278 2280 590 -f 2277 590 2280 -f 2283 1939 2281 -f 110 2281 1939 -f 590 2277 2282 -f 2283 2282 2277 -f 2206 2286 152 -f 2285 152 2286 -f 2282 2286 590 -f 2284 590 2286 -f 2287 2288 157 -f 2216 157 2288 -f 590 2284 2278 -f 2288 2278 2284 -f 2289 2292 121 -f 1906 121 2292 -f 2291 2292 592 -f 2290 592 2292 -f 2210 2295 155 -f 2294 155 2295 -f 592 2290 2293 -f 2295 2293 2290 -f 2285 2297 152 -f 2203 152 2297 -f 2293 2297 592 -f 2296 592 2297 -f 2281 110 2298 -f 1896 2298 110 -f 2298 2291 2296 -f 592 2296 2291 -f 1874 2302 119 -f 2301 119 2302 -f 2300 2302 594 -f 2299 594 2302 -f 125 2279 1868 -f 2304 1868 2279 -f 594 2299 2303 -f 2304 2303 2299 -f 2217 2306 157 -f 2287 157 2306 -f 2303 2306 594 -f 2305 594 2306 -f 2308 2212 2307 -f 154 2307 2212 -f 594 2305 2300 -f 2308 2300 2305 -f 121 2309 2289 -f 2312 2289 2309 -f 596 2311 2310 -f 2312 2310 2311 -f 119 2301 2314 -f 2315 2314 2301 -f 2310 2315 596 -f 2313 596 2315 -f 2214 2317 154 -f 2307 154 2317 -f 596 2313 2316 -f 2317 2316 2313 -f 2294 2318 155 -f 2208 155 2318 -f 2316 2318 596 -f 2311 596 2318 -f 147 2195 2321 -f 2322 2321 2195 -f 600 2320 2319 -f 2322 2319 2320 -f 2173 2324 146 -f 2189 146 2324 -f 2319 2324 600 -f 2323 600 2324 -f 2327 2168 2325 -f 145 2325 2168 -f 600 2323 2326 -f 2327 2326 2323 -f 2328 2331 162 -f 2330 162 2331 -f 600 2326 2329 -f 2331 2329 2326 -f 160 2332 2333 -f 2334 2333 2332 -f 600 2329 2320 -f 2334 2320 2329 -f 161 2335 2338 -f 2339 2338 2335 -f 2339 2336 2337 -f 605 2337 2336 -f 2343 2342 2340 -f 165 2340 2342 -f 605 2336 2341 -f 2343 2341 2336 -f 2344 2347 166 -f 2346 166 2347 -f 2341 2347 605 -f 2345 605 2347 -f 2349 162 2350 -f 2348 2350 162 -f 2337 605 2350 -f 2345 2350 605 -f 2353 2328 2349 -f 162 2349 2328 -f 608 2352 2351 -f 2353 2351 2352 -f 2354 2356 166 -f 2344 166 2356 -f 2351 2356 608 -f 2355 608 2356 -f 2360 2359 2357 -f 163 2357 2359 -f 608 2355 2358 -f 2360 2358 2355 -f 160 2333 2361 -f 2362 2361 2333 -f 2358 2362 608 -f 2352 608 2362 -f 2366 2365 2359 -f 163 2359 2365 -f 611 2364 2363 -f 2366 2363 2364 -f 2346 2368 166 -f 2354 166 2368 -f 2363 2368 611 -f 2367 611 2368 -f 2369 2371 165 -f 2340 165 2371 -f 611 2367 2370 -f 2371 2370 2367 -f 2373 164 2374 -f 2372 2374 164 -f 2370 2374 611 -f 2364 611 2374 -f 2375 2378 69 -f 1247 69 2378 -f 2377 2378 614 -f 2376 614 2378 -f 131 2051 2380 -f 2381 2380 2051 -f 614 2376 2379 -f 2381 2379 2376 -f 2382 2384 130 -f 2046 130 2384 -f 2379 2384 614 -f 2383 614 2384 -f 76 1254 2385 -f 2386 2385 1254 -f 614 2383 2377 -f 2386 2377 2383 -f 2387 2390 77 -f 1261 77 2390 -f 2388 617 2390 -f 2389 2390 617 -f 142 2093 2392 -f 2393 2392 2093 -f 617 2388 2391 -f 2393 2391 2388 -f 2394 2396 134 -f 2090 134 2396 -f 2391 2396 617 -f 2395 617 2396 -f 2398 2397 1268 -f 80 1268 2397 -f 617 2395 2389 -f 2398 2389 2395 -f 2397 2401 80 -f 1275 80 2401 -f 2399 619 2401 -f 2400 2401 619 -f 134 2078 2394 -f 2403 2394 2078 -f 2403 2402 2399 -f 619 2399 2402 -f 2404 2406 135 -f 2072 135 2406 -f 2405 619 2406 -f 2402 2406 619 -f 2408 2407 1281 -f 81 1281 2407 -f 619 2405 2400 -f 2408 2400 2405 -f 2409 2412 67 -f 1287 67 2412 -f 2411 2412 622 -f 2410 622 2412 -f 2415 2414 2314 -f 119 2314 2414 -f 622 2410 2413 -f 2415 2413 2410 -f 2416 2418 121 -f 2309 121 2418 -f 2417 622 2418 -f 2413 2418 622 -f 2420 2419 1294 -f 68 1294 2419 -f 622 2417 2411 -f 2420 2411 2417 -f 78 2421 1301 -f 2424 1301 2421 -f 2424 2422 2423 -f 625 2423 2422 -f 2250 2427 129 -f 2426 129 2427 -f 2422 2427 625 -f 2425 625 2427 -f 2430 2258 2428 -f 122 2428 2258 -f 625 2425 2429 -f 2430 2429 2425 -f 2431 74 2432 -f 1308 2432 74 -f 2429 2432 625 -f 2423 625 2432 -f 2385 2435 76 -f 1315 76 2435 -f 2434 2435 626 -f 2433 626 2435 -f 130 2063 2382 -f 2437 2382 2063 -f 626 2433 2436 -f 2437 2436 2433 -f 2058 142 2439 -f 2392 2439 142 -f 2436 2439 626 -f 2438 626 2439 -f 2440 2387 1320 -f 77 1320 2387 -f 626 2438 2434 -f 2440 2434 2438 -f 2441 2444 70 -f 1325 70 2444 -f 2443 2444 628 -f 2442 628 2444 -f 143 2156 2446 -f 2447 2446 2156 -f 628 2442 2445 -f 2447 2445 2442 -f 2380 2449 131 -f 2151 131 2449 -f 2445 2449 628 -f 2448 628 2449 -f 69 1331 2375 -f 2450 2375 1331 -f 628 2448 2443 -f 2450 2443 2448 -f 2451 2454 71 -f 1337 71 2454 -f 2452 630 2454 -f 2453 2454 630 -f 145 2170 2456 -f 2457 2456 2170 -f 2457 2455 2452 -f 630 2452 2455 -f 2165 143 2459 -f 2446 2459 143 -f 2455 2459 630 -f 2458 630 2459 -f 2460 2441 1343 -f 70 1343 2441 -f 630 2458 2453 -f 2460 2453 2458 -f 59 2461 1349 -f 2464 1349 2461 -f 2463 2464 634 -f 2462 634 2464 -f 147 2465 2467 -f 2468 2467 2465 -f 634 2462 2466 -f 2468 2466 2462 -f 2469 2472 148 -f 2471 148 2472 -f 2466 2472 634 -f 2470 634 2472 -f 65 1356 2473 -f 2474 2473 1356 -f 634 2470 2463 -f 2474 2463 2470 -f 2475 2478 60 -f 1365 60 2478 -f 636 2477 2476 -f 2478 2476 2477 -f 2199 2481 151 -f 2480 151 2481 -f 2479 636 2481 -f 2476 2481 636 -f 147 2467 2193 -f 2483 2193 2467 -f 2483 2482 2479 -f 636 2479 2482 -f 2484 2461 1371 -f 59 1371 2461 -f 2482 2484 636 -f 2477 636 2484 -f 2485 2488 79 -f 1377 79 2488 -f 2486 638 2488 -f 2487 2488 638 -f 128 1934 2490 -f 2491 2490 1934 -f 2491 2489 2486 -f 638 2486 2489 -f 129 2426 1928 -f 2493 1928 2426 -f 2489 2493 638 -f 2492 638 2493 -f 1383 2494 78 -f 2421 78 2494 -f 638 2492 2487 -f 2494 2487 2492 -f 68 2419 1389 -f 2497 1389 2419 -f 640 2496 2495 -f 2497 2495 2496 -f 1907 2499 121 -f 2416 121 2499 -f 2495 2499 640 -f 2498 640 2499 -f 120 2500 1902 -f 2502 1902 2500 -f 640 2498 2501 -f 2502 2501 2498 -f 2503 58 2504 -f 1395 2504 58 -f 2501 2504 640 -f 2496 640 2504 -f 2507 1401 2503 -f 58 2503 1401 -f 642 2506 2505 -f 2507 2505 2506 -f 1919 2509 120 -f 2500 120 2509 -f 2505 2509 642 -f 2508 642 2509 -f 132 2510 1914 -f 2512 1914 2510 -f 642 2508 2511 -f 2512 2511 2508 -f 2513 61 2514 -f 1407 2514 61 -f 2511 2514 642 -f 2506 642 2514 -f 2517 1413 2513 -f 61 2513 1413 -f 644 2516 2515 -f 2517 2515 2516 -f 2149 2519 132 -f 2510 132 2519 -f 2518 644 2519 -f 2515 2519 644 -f 144 2520 2158 -f 2522 2158 2520 -f 2518 2522 644 -f 2521 644 2522 -f 2524 2523 1419 -f 62 1419 2523 -f 644 2521 2516 -f 2524 2516 2521 -f 1425 62 2527 -f 2523 2527 62 -f 2526 2527 646 -f 2525 646 2527 -f 144 2177 2520 -f 2529 2520 2177 -f 2529 2528 2525 -f 646 2525 2528 -f 2532 2186 2530 -f 149 2530 2186 -f 2528 2532 646 -f 2531 646 2532 -f 2533 63 2534 -f 1431 2534 63 -f 646 2531 2526 -f 2534 2526 2531 -f 2537 1437 2533 -f 63 2533 1437 -f 648 2536 2535 -f 2537 2535 2536 -f 2187 2539 149 -f 2530 149 2539 -f 2535 2539 648 -f 2538 648 2539 -f 150 2540 2182 -f 2542 2182 2540 -f 648 2538 2541 -f 2542 2541 2538 -f 2543 64 2544 -f 1443 2544 64 -f 2541 2544 648 -f 2536 648 2544 -f 2547 1449 2543 -f 64 2543 1449 -f 2545 649 2547 -f 2546 2547 649 -f 150 2201 2540 -f 2549 2540 2201 -f 2549 2548 2545 -f 649 2545 2548 -f 2480 2551 151 -f 2197 151 2551 -f 2548 2551 649 -f 2550 649 2551 -f 2552 2475 1454 -f 60 1454 2475 -f 649 2550 2546 -f 2552 2546 2550 -f 1461 2555 71 -f 2451 71 2555 -f 651 2554 2553 -f 2555 2553 2554 -f 2558 1470 2556 -f 72 2556 1470 -f 651 2553 2557 -f 2558 2557 2553 -f 2338 2561 161 -f 2560 161 2561 -f 651 2557 2559 -f 2561 2559 2557 -f 162 2330 2348 -f 2563 2348 2330 -f 651 2559 2562 -f 2563 2562 2559 -f 2456 2564 145 -f 2325 145 2564 -f 651 2562 2554 -f 2564 2554 2562 -f 147 2321 2465 -f 2567 2465 2321 -f 2567 2565 2566 -f 653 2566 2565 -f 2568 2570 160 -f 2332 160 2570 -f 2565 2570 653 -f 2569 653 2570 -f 148 2471 2571 -f 2572 2571 2471 -f 2572 2566 2569 -f 653 2569 2566 -f 2577 2576 2573 -f 170 2573 2576 -f 2575 2577 658 -f 2574 658 2577 -f 2581 2580 2578 -f 167 2578 2580 -f 658 2574 2579 -f 2581 2579 2574 -f 2582 2585 169 -f 2584 169 2585 -f 2579 2585 658 -f 2583 658 2585 -f 2588 2587 2586 -f 168 2586 2587 -f 658 2583 2575 -f 2588 2575 2583 -f 2589 2593 177 -f 2592 177 2593 -f 2590 663 2593 -f 2591 2593 663 -f 178 2594 2596 -f 2597 2596 2594 -f 2597 2595 2590 -f 663 2590 2595 -f 2601 2600 2598 -f 173 2598 2600 -f 2595 2601 663 -f 2599 663 2601 -f 2604 2603 2602 -f 174 2602 2603 -f 663 2599 2591 -f 2604 2591 2599 -f 178 2605 2608 -f 2609 2608 2605 -f 2609 2606 2607 -f 668 2607 2606 -f 2612 179 2613 -f 2610 2613 179 -f 2606 2613 668 -f 2611 668 2613 -f 2617 2616 2614 -f 172 2614 2616 -f 668 2611 2615 -f 2617 2615 2611 -f 2620 2619 2618 -f 171 2618 2619 -f 2607 668 2620 -f 2615 2620 668 -f 174 2603 2623 -f 2624 2623 2603 -f 2622 2624 672 -f 2621 672 2624 -f 2627 2598 2625 -f 173 2625 2598 -f 672 2621 2626 -f 2627 2626 2621 -f 2628 2631 176 -f 2630 176 2631 -f 2629 672 2631 -f 2626 2631 672 -f 2632 2634 175 -f 2633 175 2634 -f 2622 672 2634 -f 2629 2634 672 -f 2637 175 2638 -f 2633 2638 175 -f 2636 2638 675 -f 2635 675 2638 -f 2641 2628 2639 -f 176 2639 2628 -f 2635 2641 675 -f 2640 675 2641 -f 2619 2644 171 -f 2643 171 2644 -f 675 2640 2642 -f 2644 2642 2640 -f 2614 172 2646 -f 2645 2646 172 -f 2642 2646 675 -f 2636 675 2646 -f 177 2647 2589 -f 2650 2589 2647 -f 678 2649 2648 -f 2650 2648 2649 -f 180 2651 2653 -f 2654 2653 2651 -f 678 2648 2652 -f 2654 2652 2648 -f 2656 179 2657 -f 2612 2657 179 -f 2652 2657 678 -f 2655 678 2657 -f 178 2596 2605 -f 2658 2605 2596 -f 2655 2658 678 -f 2649 678 2658 -f 2662 2647 2659 -f 177 2659 2647 -f 681 2661 2660 -f 2662 2660 2661 -f 160 2361 2664 -f 2665 2664 2361 -f 681 2660 2663 -f 2665 2663 2660 -f 2365 2667 163 -f 2357 163 2667 -f 2663 2667 681 -f 2666 681 2667 -f 164 2668 2372 -f 2670 2372 2668 -f 681 2666 2669 -f 2670 2669 2666 -f 2671 180 2672 -f 2653 2672 180 -f 681 2669 2661 -f 2672 2661 2669 -f 179 2656 2675 -f 2676 2675 2656 -f 2676 2673 2674 -f 683 2674 2673 -f 2671 2678 180 -f 2651 180 2678 -f 2677 683 2678 -f 2673 2678 683 -f 2373 2680 164 -f 2668 164 2680 -f 683 2677 2679 -f 2680 2679 2677 -f 2342 2682 165 -f 2369 165 2682 -f 683 2679 2681 -f 2682 2681 2679 -f 2683 2684 161 -f 2335 161 2684 -f 2681 2684 683 -f 2674 683 2684 -f 2616 2688 172 -f 2687 172 2688 -f 685 2686 2685 -f 2688 2685 2686 -f 179 2675 2610 -f 2690 2610 2675 -f 2690 2689 2685 -f 685 2685 2689 -f 2692 2683 2560 -f 161 2560 2683 -f 685 2689 2691 -f 2692 2691 2689 -f 72 1602 2556 -f 2694 2556 1602 -f 685 2691 2693 -f 2694 2693 2691 -f 2696 1597 2695 -f 73 2695 1597 -f 685 2693 2686 -f 2696 2686 2693 -f 1610 2700 66 -f 2699 66 2700 -f 688 2698 2697 -f 2700 2697 2698 -f 2473 2702 65 -f 1621 65 2702 -f 2697 2702 688 -f 2701 688 2702 -f 148 2703 2469 -f 2705 2469 2703 -f 688 2701 2704 -f 2705 2704 2701 -f 2707 174 2708 -f 2623 2708 174 -f 688 2704 2706 -f 2708 2706 2704 -f 2710 2632 2709 -f 175 2709 2632 -f 688 2706 2698 -f 2710 2698 2706 -f 73 1625 2695 -f 2713 2695 1625 -f 2713 2711 2712 -f 689 2712 2711 -f 66 2699 1631 -f 2715 1631 2699 -f 2711 2715 689 -f 2714 689 2715 -f 2717 2709 2637 -f 175 2637 2709 -f 689 2714 2716 -f 2717 2716 2714 -f 172 2687 2645 -f 2718 2645 2687 -f 689 2716 2712 -f 2718 2712 2716 -f 2571 2721 148 -f 2703 148 2721 -f 2720 2721 690 -f 2719 690 2721 -f 160 2664 2568 -f 2723 2568 2664 -f 690 2719 2722 -f 2723 2722 2719 -f 177 2592 2659 -f 2725 2659 2592 -f 690 2722 2724 -f 2725 2724 2722 -f 2726 2602 2707 -f 174 2707 2602 -f 690 2724 2720 -f 2726 2720 2724 -f 2600 2730 173 -f 2729 173 2730 -f 2727 693 2730 -f 2728 2730 693 -f 178 2731 2594 -f 2733 2594 2731 -f 693 2727 2732 -f 2733 2732 2727 -f 2576 2736 170 -f 2735 170 2736 -f 2732 2736 693 -f 2734 693 2736 -f 2737 2738 168 -f 2586 168 2738 -f 2728 693 2738 -f 2734 2738 693 -f 176 2630 2741 -f 2742 2741 2630 -f 2742 2739 2740 -f 695 2740 2739 -f 2625 173 2744 -f 2729 2744 173 -f 2744 2743 2739 -f 695 2739 2743 -f 2587 2746 168 -f 2737 168 2746 -f 2743 2746 695 -f 2745 695 2746 -f 2747 2748 169 -f 2582 169 2748 -f 2740 695 2748 -f 2745 2748 695 -f 171 2643 2751 -f 2752 2751 2643 -f 2749 697 2752 -f 2750 2752 697 -f 176 2741 2639 -f 2754 2639 2741 -f 2754 2753 2749 -f 697 2749 2753 -f 2584 2756 169 -f 2747 169 2756 -f 2753 2756 697 -f 2755 697 2756 -f 2757 2758 167 -f 2578 167 2758 -f 2750 697 2758 -f 2755 2758 697 -f 178 2608 2731 -f 2761 2731 2608 -f 698 2760 2759 -f 2761 2759 2760 -f 2751 2763 171 -f 2618 171 2763 -f 2759 2763 698 -f 2762 698 2763 -f 2580 2765 167 -f 2757 167 2765 -f 2762 2765 698 -f 2764 698 2765 -f 2735 2766 170 -f 2573 170 2766 -f 2764 2766 698 -f 2760 698 2766 -f 123 2767 1883 -f 2770 1883 2767 -f 2770 2768 2769 -f 702 2769 2768 -f 2773 183 2774 -f 2771 2774 183 -f 2768 2774 702 -f 2772 702 2774 -f 2777 182 2778 -f 2775 2778 182 -f 2772 2778 702 -f 2776 702 2778 -f 2780 2779 1888 -f 122 1888 2779 -f 702 2776 2769 -f 2780 2769 2776 -f 2779 2783 122 -f 2428 122 2783 -f 2782 2783 704 -f 2781 704 2783 -f 182 2784 2775 -f 2786 2775 2784 -f 704 2781 2785 -f 2786 2785 2781 -f 1703 2789 100 -f 2788 100 2789 -f 2785 2789 704 -f 2787 704 2789 -f 2790 1698 2431 -f 74 2431 1698 -f 704 2787 2782 -f 2790 2782 2787 -f 67 1709 2409 -f 2793 2409 1709 -f 707 2792 2791 -f 2793 2791 2792 -f 2794 2796 99 -f 1718 99 2796 -f 2791 2796 707 -f 2795 707 2796 -f 181 2797 2799 -f 2800 2799 2797 -f 707 2795 2798 -f 2800 2798 2795 -f 2801 119 2802 -f 2414 2802 119 -f 2798 2802 707 -f 2792 707 2802 -f 119 2801 1872 -f 2805 1872 2801 -f 2804 2805 709 -f 2803 709 2805 -f 2806 2808 181 -f 2797 181 2808 -f 709 2803 2807 -f 2808 2807 2803 -f 2773 2811 183 -f 2810 183 2811 -f 2809 709 2811 -f 2807 2811 709 -f 1877 2812 123 -f 2767 123 2812 -f 2812 2804 2809 -f 709 2809 2804 -f 2815 1731 2788 -f 100 2788 1731 -f 711 2814 2813 -f 2815 2813 2814 -f 2777 2817 182 -f 2784 182 2817 -f 2813 2817 711 -f 2816 711 2817 -f 183 2818 2771 -f 2820 2771 2818 -f 711 2816 2819 -f 2820 2819 2816 -f 75 1737 2821 -f 2822 2821 1737 -f 2819 2822 711 -f 2814 711 2822 -f 75 2821 1743 -f 2825 1743 2821 -f 2824 2825 712 -f 2823 712 2825 -f 183 2810 2818 -f 2827 2818 2810 -f 712 2823 2826 -f 2827 2826 2823 -f 2806 181 2829 -f 2799 2829 181 -f 2826 2829 712 -f 2828 712 2829 -f 2830 2794 1748 -f 99 1748 2794 -f 712 2828 2824 -f 2830 2824 2828 -f 2835 2834 2831 -f 184 2831 2834 -f 2835 2832 2833 -f 716 2833 2832 -f 2838 186 2839 -f 2836 2839 186 -f 2832 2839 716 -f 2837 716 2839 -f 2840 2842 185 -f 2841 185 2842 -f 2837 2842 716 -f 2833 716 2842 -f 2843 2846 184 -f 2831 184 2846 -f 719 2845 2844 -f 2846 2844 2845 -f 2006 2849 117 -f 2848 117 2849 -f 719 2844 2847 -f 2849 2847 2844 -f 136 1937 2015 -f 2851 2015 1937 -f 719 2847 2850 -f 2851 2850 2847 -f 2852 2854 128 -f 1932 128 2854 -f 2850 2854 719 -f 2853 719 2854 -f 186 2838 2855 -f 2856 2855 2838 -f 719 2853 2845 -f 2856 2845 2853 -f 2834 2859 184 -f 2843 184 2859 -f 721 2858 2857 -f 2859 2857 2858 -f 185 2860 2840 -f 2862 2840 2860 -f 721 2857 2861 -f 2862 2861 2857 -f 135 2074 2864 -f 2865 2864 2074 -f 721 2861 2863 -f 2865 2863 2861 -f 2115 2867 113 -f 2067 113 2867 -f 721 2863 2866 -f 2867 2866 2863 -f 117 2848 2111 -f 2868 2111 2848 -f 721 2866 2858 -f 2868 2858 2866 -f 2872 2871 1794 -f 104 1794 2871 -f 723 2870 2869 -f 2872 2869 2870 -f 2407 2874 81 -f 1801 81 2874 -f 2873 723 2874 -f 2869 2874 723 -f 2864 2876 135 -f 2404 135 2876 -f 2876 2875 2873 -f 723 2873 2875 -f 2877 2878 185 -f 2860 185 2878 -f 2875 2878 723 -f 2870 723 2878 -f 1805 2881 79 -f 2485 79 2881 -f 2880 2881 725 -f 2879 725 2881 -f 2884 1812 2882 -f 105 2882 1812 -f 725 2879 2883 -f 2884 2883 2879 -f 2855 2887 186 -f 2886 186 2887 -f 2883 2887 725 -f 2885 725 2887 -f 128 2490 2852 -f 2888 2852 2490 -f 725 2885 2880 -f 2888 2880 2885 -f 2836 186 2892 -f 2889 2892 186 -f 2891 2892 729 -f 2890 729 2892 -f 2896 2895 2893 -f 188 2893 2895 -f 2896 2894 2890 -f 729 2890 2894 -f 2900 2899 2897 -f 187 2897 2899 -f 729 2894 2898 -f 2900 2898 2894 -f 185 2841 2901 -f 2902 2901 2841 -f 2902 2891 2898 -f 729 2898 2891 -f 185 2901 2877 -f 2905 2877 2901 -f 731 2904 2903 -f 2905 2903 2904 -f 2906 2908 187 -f 2897 187 2908 -f 2903 2908 731 -f 2907 731 2908 -f 108 1837 2910 -f 2911 2910 1837 -f 731 2907 2909 -f 2911 2909 2907 -f 2871 2912 104 -f 1832 104 2912 -f 2909 2912 731 -f 2904 731 2912 -f 1843 2915 105 -f 2882 105 2915 -f 2913 733 2915 -f 2914 2915 733 -f 109 2916 1850 -f 2918 1850 2916 -f 2918 2917 2913 -f 733 2913 2917 -f 2920 188 2921 -f 2895 2921 188 -f 2917 2921 733 -f 2919 733 2921 -f 2922 2889 2886 -f 186 2886 2889 -f 733 2919 2914 -f 2922 2914 2919 -f 2925 2906 2899 -f 187 2899 2906 -f 734 2924 2923 -f 2925 2923 2924 -f 2927 2893 2920 -f 188 2920 2893 -f 734 2923 2926 -f 2927 2926 2923 -f 1860 2929 109 -f 2916 109 2929 -f 2926 2929 734 -f 2928 734 2929 -f 2910 2930 108 -f 1856 108 2930 -f 2928 2930 734 -f 2924 734 2930 diff --git a/data/results/output_render/serapis_with_ssao.jpg b/data/results/output_render/serapis_with_ssao.jpg deleted file mode 100644 index cead4be..0000000 Binary files a/data/results/output_render/serapis_with_ssao.jpg and /dev/null differ diff --git a/data/results/output_render/serapis_without_ssao.jpg b/data/results/output_render/serapis_without_ssao.jpg deleted file mode 100644 index eb1d4c5..0000000 Binary files a/data/results/output_render/serapis_without_ssao.jpg and /dev/null differ diff --git a/data/results/output_render/withSSS.jpg b/data/results/output_render/withSSS.jpg deleted file mode 100644 index cf77f7e..0000000 Binary files a/data/results/output_render/withSSS.jpg and /dev/null differ diff --git a/data/results/output_render/withSSS2.jpg b/data/results/output_render/withSSS2.jpg deleted file mode 100644 index 2b38924..0000000 Binary files a/data/results/output_render/withSSS2.jpg and /dev/null differ diff --git a/data/source.npy b/data/source.npy old mode 100644 new mode 100755 diff --git a/demo1-render.py b/demo1-render.py old mode 100644 new mode 100755 diff --git a/demo1.5-SSS.py b/demo1.5-SSS.py old mode 100644 new mode 100755 diff --git a/demo2-deform.py b/demo2-deform.py old mode 100644 new mode 100755 diff --git a/demo3-render_specular.py b/demo3-render_specular.py old mode 100644 new mode 100755 diff --git a/demo4-optim_textures.py b/demo4-optim_textures.py old mode 100644 new mode 100755 diff --git a/demo5-optim_metallic_textures.py b/demo5-optim_metallic_textures.py old mode 100644 new mode 100755 diff --git a/demo6-optim_roughness_textures.py b/demo6-optim_roughness_textures.py old mode 100644 new mode 100755 diff --git a/demo7-nerf.py b/demo7-nerf.py old mode 100644 new mode 100755 diff --git a/demo8-drot.py b/demo8-drot.py new file mode 100644 index 0000000..dfe0241 --- /dev/null +++ b/demo8-drot.py @@ -0,0 +1,239 @@ + +# + + + +import torch +import os +import tqdm +import numpy as np +import imageio +import cv2 +import argparse +import jrender as jr + +import jittor as jt + +from jittor import nn +jt.flags.use_cuda = 1 + +import time +if torch.cuda.is_available(): + device = torch.device("cuda:0") + torch.cuda.set_device(device) +else: + device = torch.device("cpu") +#pip install geomloss[full] pykeops +from geomloss import SamplesLoss + +current_dir = os.path.dirname(os.path.realpath(__file__)) +data_dir = os.path.join(current_dir, 'data') + +class SimpleModel(nn.Module): + def __init__(self, template_path): + super(SimpleModel, self).__init__() + + # set template mesh + self.template_mesh = jr.Mesh.from_obj(template_path, dr_type='softras', load_texture=True, texture_res=5, texture_type='surface') + self.vertices = self.template_mesh.vertices.stop_grad() + self.faces = self.template_mesh.faces.stop_grad() + self.textures = self.template_mesh.textures.stop_grad() + + # optimize offset + self.displace = jt.zeros((1, 1, 1))+[0.0,0.0,0.4] + + def execute(self, batch_size): + vertices = self.vertices+self.displace + return jr.Mesh(vertices.repeat(batch_size, 1, 1), self.faces.repeat(batch_size, 1, 1), dr_type='softras', textures = self.textures) + +def _axis_angle_rotation(axis: str, angle): + """ + Return the rotation matrices for one of the rotations about an axis + of which Euler angles describe, for each value of the angle given. + + Args: + axis: Axis label "X" or "Y or "Z". + angle: any shape tensor of Euler angles in radians + + Returns: + Rotation matrices as tensor of shape (..., 3, 3). + """ + cos = jt.cos(angle) + sin = jt.sin(angle) + one = jt.ones_like(angle) + zero = jt.zeros_like(angle) + if axis == "X": + R_flat = (one, zero, zero, zero, cos, -sin, zero, sin, cos) + elif axis == "Y": + R_flat = (cos, zero, sin, zero, one, zero, -sin, zero, cos) + elif axis == "Z": + R_flat = (cos, -sin, zero, sin, cos, zero, zero, zero, one) + else: + raise ValueError("letter must be either X, Y or Z.") + return jt.stack(R_flat, -1).reshape(angle.shape + (3, 3)) + +def euler_angles_to_matrix(euler_angles, convention="XYZ"): + matrices = [ + _axis_angle_rotation(c, e) + for c, e in zip(convention, jt.unbind(euler_angles, -1)) + ] + return jt.matmul(jt.matmul(matrices[0], matrices[1]), matrices[2]) + +class Furniture(nn.Module): + def __init__(self, template_path): + super(Furniture, self).__init__() + meshes_path = [os.path.join(template_path,x) for x in os.listdir(template_path) if x.endswith(".obj")] + self.meshes = [] + self.displaces = [] + self.rotations = [] + for meshpath in meshes_path: + #print(meshpath) + mesh = jr.Mesh.from_obj(meshpath, dr_type='softras', load_texture=True, texture_res=10, texture_type='surface') + mesh.vertices = mesh.vertices.stop_grad() + self.meshes.append(mesh) + self.displaces.append(jt.zeros(3)) + self.rotations.append(jt.zeros(3)) + + + def transform(self, vertices, trans, rot): + rot_center = jt.mean(vertices,dim=1,keepdims=True) + vertices-=rot_center + #rot = jt.array([0,3.1415926/2.0,0]) + #print(vertices) + vertices = jt.matmul(vertices, euler_angles_to_matrix(rot).transpose(0,2,1)) + #print(vertices) + vertices+=rot_center+trans + return vertices + + def execute(self): + meshlist = [] + for (mesh,trans,rot) in zip(self.meshes,self.displaces,self.rotations): + trans[1] = 0 + rot[0] = 0.0 + rot[2]=0.0 + #print(trans,rot) + new_vert = self.transform(mesh.vertices.clone(), trans, rot) + adjust_mesh = jr.Mesh(new_vert, mesh.faces, dr_type='softras', textures = mesh.textures) + meshlist.append(adjust_mesh) + #print(new_vert) + return jr.join_meshes_as_scene(meshlist,include_texture=True) + + +class Matcher(): + def __init__(self, res, device) -> None: + self.loss = SamplesLoss("sinkhorn", blur=0.01) + self.device=device + self.resolution = res + pass + + def match_Sinkhorn(self, haspos, render_point_5d, gt_rgb, view): + h,w = render_point_5d.shape[1:3] + target_point_5d = torch.zeros((haspos.shape[0], h, w, 5), device=self.device) + target_point_5d[..., :3] = torch.clamp(gt_rgb,0,1) + target_point_5d[..., 3:] = render_point_5d[...,3:].clone().detach() + target_point_5d = target_point_5d.reshape(-1, h*w, 5) + render_point_5d_match = render_point_5d.clone().reshape(-1,h*w,5) + render_point_5d_match.clamp_(0.0,1.0) + pointloss = self.loss(render_point_5d_match, target_point_5d)*self.resolution*self.resolution + [g] = torch.autograd.grad(torch.sum(pointloss), [render_point_5d_match]) + return (render_point_5d-g.reshape(-1,h,w,5)).detach() + + def match(self, gt_rgb, rgb, point, msk, view=0): + render_point_5d = torch.cat([torch.clamp(rgb, 0.0,1.0)[...,:3], point], dim=-1) + res = self.match_Sinkhorn(msk, render_point_5d, gt_rgb[...,:3], view) + return res + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('-i', '--filename-input', type=str, + default=os.path.join(data_dir, 'source.npy')) + parser.add_argument('-c', '--camera-input', type=str, + default=os.path.join(data_dir, 'camera.npy')) + parser.add_argument('-t', '--template-mesh', type=str, + default=os.path.join(data_dir, 'furniture')) + parser.add_argument('-o', '--output-dir', type=str, + default=os.path.join(data_dir, 'results/output_drot_furniture')) + parser.add_argument('-b', '--batch-size', type=int, + default=1) + args = parser.parse_args() + + os.makedirs(args.output_dir, exist_ok=True) + model = Furniture(os.path.join(args.template_mesh,"gt")) + # read training images and camera poses + + res=128 + sta = time.time() + + bg_img = cv2.imread(os.path.join(args.template_mesh,"init", "0_bg.png")) + bg_img = cv2.resize(bg_img,(res,res)) + bg_img = cv2.cvtColor(bg_img, cv2.COLOR_BGR2RGB) + bg_img = jt.array(bg_img)/255.0 + + cam = np.loadtxt(os.path.join(args.template_mesh,"gt","camera.txt")).tolist() + pos = jt.array([cam[0][0],cam[0][2],-cam[0][1]]) + rot = jt.array([cam[1][0],cam[1][2],cam[1][1]]) + + up = jt.array([0,-1,0.]) + rotm = euler_angles_to_matrix(rot,convention="XYZ")[0] + dir = jt.matmul(up,rotm) + dir[2]*=-1 + + mesh = model() + renderer = jr.Renderer(image_size=res, background_color=[1.0,1.0,1.0], sigma_val=1e-4, aggr_func_rgb='hard', camera_mode='look', eye = pos, camera_direction = dir, viewing_angle=35, dr_type='DrL', coordinate = "left") + images, points_orig, msks_orig = renderer.render_mesh(mesh, mode='rgb') + images_gt = jt.array(images) + images_gt = images_gt.permute(0,2,3,1)[...,:3] + + images_gt[msks_orig[:,0,...]==0] = bg_img[msks_orig[0,0]==0] + image = images_gt[0].numpy() + imageio.imsave(os.path.join(args.output_dir, 'gt.jpg'), (255*image[...,:3]).astype(np.uint8)) + + #points_orig = (points_orig+1.0)/2.0 + #pos_vis = np.zeros((res,res,3)) + #pos_vis[...,:2] = points_orig.numpy().transpose(0, 2, 3, 1)[0] + #pos_vis[...,:2] *= msks_orig.numpy().transpose(0, 2, 3, 1)[0] + #print(image_gt_torch.shape) + #cv2.imwrite("tmp.png",(pos_vis*255).astype(np.uint8)) + #exit() + + writer = imageio.get_writer(os.path.join(args.output_dir, 'process.gif'), mode='I') + image_gt_torch = torch.from_numpy(images_gt.numpy()) + + + model = Furniture(os.path.join(args.template_mesh,"init")) + optimizer = nn.Adam(model.displaces+model.rotations, 0.02) + matcher = Matcher(res,device) + loop = tqdm.tqdm(list(range(0, 500))) + + for i in loop: + mesh = model() + images_pred, points, msks = renderer.render_mesh(mesh, mode='silhouettes') + points = (points+1.0)/2.0 + images_pred = jt.array(images_pred).permute(0,2,3,1)[...,:3] + points = jt.array(points).permute(0,2,3,1) + msks = jt.array(msks).permute(0,2,3,1) + images_pred[msks[...,0]==0] = bg_img[msks[0,...,0]==0] + image_torch = torch.from_numpy(images_pred.data).to(device).requires_grad_() + points_torch = torch.from_numpy(points.data).to(device).requires_grad_() + msks_torch = torch.from_numpy(msks.data).to(device) + + match_res = jt.array(matcher.match(image_gt_torch, image_torch, points_torch, msks_torch).cpu().numpy()) + x = jt.concat([jt.array(images_pred[...,:3]),points], dim=-1) + loss = jt.mean((x-match_res)**2) + + loop.set_description('Loss: %.4f'%(loss.item())) + optimizer.step(loss) + + if i % 10 == 0: + image = images_pred.numpy()[0][...,:3] + imageio.imsave(os.path.join(args.output_dir, 'deform_%05d.jpg'%i), (255*image).astype(np.uint8)) + writer.append_data((255*image).astype(np.uint8)) + + writer.close() + # save optimized mesh + model().save_obj(os.path.join(args.output_dir, 'final.obj'), save_texture=True) + print(f"Cost {time.time() - sta} secs.") + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/download_competition_data.sh b/download_competition_data.sh old mode 100644 new mode 100755 diff --git a/download_example_data.sh b/download_example_data.sh old mode 100644 new mode 100755 diff --git a/jrender/Scene/__init__.py b/jrender/Scene/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/objects/__init__.py b/jrender/Scene/objects/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/objects/light.py b/jrender/Scene/objects/light.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/objects/object.py b/jrender/Scene/objects/object.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/objects/utils/BBox.py b/jrender/Scene/objects/utils/BBox.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/objects/utils/__init__.py b/jrender/Scene/objects/utils/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/objects/utils/create_TBN.py b/jrender/Scene/objects/utils/create_TBN.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/scene.py b/jrender/Scene/scene.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/textures/__init__.py b/jrender/Scene/textures/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/textures/texture.py b/jrender/Scene/textures/texture.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/textures/utils/__init__.py b/jrender/Scene/textures/utils/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/Scene/textures/utils/sample2D.py b/jrender/Scene/textures/utils/sample2D.py old mode 100644 new mode 100755 diff --git a/jrender/__init__.py b/jrender/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/io/__init__.py b/jrender/io/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/io/load_obj.py b/jrender/io/load_obj.py old mode 100644 new mode 100755 diff --git a/jrender/io/save_obj.py b/jrender/io/save_obj.py old mode 100644 new mode 100755 diff --git a/jrender/io/utils/_load_obj_for_n3mr.py b/jrender/io/utils/_load_obj_for_n3mr.py old mode 100644 new mode 100755 diff --git a/jrender/io/utils/_load_obj_for_softras.py b/jrender/io/utils/_load_obj_for_softras.py old mode 100644 new mode 100755 diff --git a/jrender/io/utils/create_texture_image.py b/jrender/io/utils/create_texture_image.py old mode 100644 new mode 100755 diff --git a/jrender/io/utils/load_textures.py b/jrender/io/utils/load_textures.py old mode 100644 new mode 100755 diff --git a/jrender/loss/__init__.py b/jrender/loss/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/loss/flatten_loss.py b/jrender/loss/flatten_loss.py old mode 100644 new mode 100755 diff --git a/jrender/loss/iou_loss.py b/jrender/loss/iou_loss.py old mode 100644 new mode 100755 diff --git a/jrender/loss/laplacian_loss.py b/jrender/loss/laplacian_loss.py old mode 100644 new mode 100755 diff --git a/jrender/render2/RenderDesc/Desc.py b/jrender/render2/RenderDesc/Desc.py old mode 100644 new mode 100755 diff --git a/jrender/render2/RenderDesc/MRT.py b/jrender/render2/RenderDesc/MRT.py old mode 100644 new mode 100755 diff --git a/jrender/render2/RenderDesc/__init__.py b/jrender/render2/RenderDesc/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/render2/__init__.py b/jrender/render2/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/render2/render2.py b/jrender/render2/render2.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/Cook_Torrance.py b/jrender/render2/utils/Cook_Torrance.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/__init__.py b/jrender/render2/utils/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/FXAA_cuda.py b/jrender/render2/utils/cuda/FXAA_cuda.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/SSAO_cuda.py b/jrender/render2/utils/cuda/SSAO_cuda.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/SSDO_cuda.py b/jrender/render2/utils/cuda/SSDO_cuda.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/SSR_cuda.py b/jrender/render2/utils/cuda/SSR_cuda.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/SSSR_cuda.py b/jrender/render2/utils/cuda/SSSR_cuda.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/VSSM_cuda.py b/jrender/render2/utils/cuda/VSSM_cuda.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/__init__.py b/jrender/render2/utils/cuda/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/cuda/conv.py b/jrender/render2/utils/cuda/conv.py old mode 100644 new mode 100755 diff --git a/jrender/render2/utils/get_points_from_angle.py b/jrender/render2/utils/get_points_from_angle.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/__init__.py b/jrender/renderer/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/__init__.py b/jrender/renderer/dr/__init__.py old mode 100644 new mode 100755 index cfa7ab7..d342d44 --- a/jrender/renderer/dr/__init__.py +++ b/jrender/renderer/dr/__init__.py @@ -1,2 +1,3 @@ from .softras import * -from .n3mr import * \ No newline at end of file +from .n3mr import * +from .dr_l import * \ No newline at end of file diff --git a/jrender/renderer/dr/dr_l/DrL_rasterize.py b/jrender/renderer/dr/dr_l/DrL_rasterize.py new file mode 100755 index 0000000..2999e41 --- /dev/null +++ b/jrender/renderer/dr/dr_l/DrL_rasterize.py @@ -0,0 +1,140 @@ +import jittor as jt +from jittor import nn +from jittor import Function +import numpy as np +from .cuda import DrL_rasterize as soft_rasterize_cuda + +class DrL_RasterizeFunction(Function): + def __init__(self, image_size=256, + background_color=[0, 0, 0], near=1, far=100, + fill_back=True, eps=1e-3, + sigma_val=1e-5, dist_func='euclidean', dist_eps=1e-4, + gamma_val=1e-4, aggr_func_rgb='hard', aggr_func_alpha='prod', + texture_type='surface', bin_size = 0, max_elems_per_bin = 0, max_faces_per_pixel_for_grad = 16): + + self.image_size = image_size + self.background_color = background_color + self.near = near + self.far = far + self.eps = eps + self.sigma_val = sigma_val + self.gamma_val = gamma_val + self.dist_func = dist_func + self.dist_eps = np.log(1. / dist_eps - 1.) + self.aggr_func_rgb = aggr_func_rgb + self.aggr_func_alpha = aggr_func_alpha + self.fill_back = fill_back + self.texture_type = texture_type + + self.bin_size = bin_size + self.max_elems_per_bin = max_elems_per_bin + self.max_faces_id = max_faces_per_pixel_for_grad + + def execute(self, face_vertices, textures): + + # face_vertices: [nb, nf, 9] + # textures: [nb, nf, 9] + + func_dist_map = {'hard': 0, 'barycentric': 1, 'euclidean': 2} + func_rgb_map = {'hard': 0, 'softmax': 1} + func_alpha_map = {'hard': 0, 'sum': 1, 'prod': 2} + func_map_sample = {'surface': 0, 'vertex': 1} + + image_size = self.image_size + background_color = self.background_color + near = self.near + far = self.far + eps = self.eps + sigma_val = self.sigma_val + gamma_val = self.gamma_val + dist_eps = self.dist_eps + fill_back = self.fill_back + dist_func = self.dist_func + aggr_func_rgb = self.aggr_func_rgb + aggr_func_alpha = self.aggr_func_alpha + texture_type = self.texture_type + + self.func_dist_type = func_dist_map[dist_func] + self.func_rgb_type = func_rgb_map[aggr_func_rgb] + self.func_alpha_type = func_alpha_map[aggr_func_alpha] + self.texture_type = func_map_sample[texture_type] + + face_vertices = face_vertices.clone() + textures = textures.clone() + + self.batch_size, self.num_faces = face_vertices.shape[:2] + + faces_info = jt.zeros((self.batch_size, self.num_faces, 9*3)) # [inv*9, sym*9, obt*3, 0*6] + aggrs_info = jt.zeros((self.batch_size, 2, self.image_size, self.image_size)) + faces_id_buffer = jt.zeros((self.batch_size, self.max_faces_id, self.image_size, self.image_size),dtype="int32") + + soft_colors = jt.ones((self.batch_size, 4, self.image_size, self.image_size)) + soft_colors[:, 0, :, :] *= background_color[0] + soft_colors[:, 1, :, :] *= background_color[1] + soft_colors[:, 2, :, :] *= background_color[2] + + + points = jt.zeros((self.batch_size, 2, self.image_size, self.image_size)) + msk = jt.zeros((self.batch_size, 1, self.image_size, self.image_size)) + + # TODO: soft_colors do not init in cuda + faces_info, aggrs_info, soft_colors, faces_id_buffer, points, msk = \ + soft_rasterize_cuda.forward_DrL_rasterize(face_vertices, textures, + faces_info, aggrs_info, + soft_colors, faces_id_buffer, + points, msk, + image_size, near, far, eps, + sigma_val, self.func_dist_type, self.dist_eps, + gamma_val, self.func_rgb_type, self.func_alpha_type, + self.texture_type, int(fill_back)) + + self.save_vars = face_vertices, textures, soft_colors, points, faces_info, aggrs_info, faces_id_buffer + return soft_colors, points, msk + + def grad(self, grad_soft_colors, grad_points, grad_msk): + + face_vertices, textures, soft_colors, points, faces_info, aggrs_info, faces_id_buffer = self.save_vars + + faces_id_buffer = jt.transpose(faces_id_buffer, (0, 2, 3, 1)) + image_size = self.image_size + background_color = self.background_color + near = self.near + far = self.far + eps = self.eps + sigma_val = self.sigma_val + dist_eps = self.dist_eps + gamma_val = self.gamma_val + func_dist_type = self.func_dist_type + func_rgb_type = self.func_rgb_type + func_alpha_type = self.func_alpha_type + texture_type = self.texture_type + fill_back = self.fill_back + + grad_faces = jt.zeros((face_vertices.shape)) + grad_textures = jt.zeros((textures.shape)) + + grad_faces, grad_textures = \ + soft_rasterize_cuda.backward_DrL_rasterize(face_vertices, textures, soft_colors, points, + faces_info, aggrs_info, faces_id_buffer, + grad_faces, grad_textures, grad_soft_colors, grad_points, + image_size, near, far, eps, + sigma_val, func_dist_type, dist_eps, + gamma_val, func_rgb_type, func_alpha_type, + texture_type, int(fill_back)) + + return grad_faces, grad_textures + + +def DrL_rasterize(face_vertices, textures, image_size=256, + background_color=[0, 0, 0], near=1, far=100, + fill_back=True, eps=1e-3, + sigma_val=1e-5, dist_func='euclidean', dist_eps=1e-4, + gamma_val=1e-4, aggr_func_rgb='softmax', aggr_func_alpha='prod', + texture_type='surface', bin_size=0, max_elems_per_bin=0, max_faces_per_pixel_for_grad=16): + return DrL_RasterizeFunction(image_size, + background_color, near, far, + fill_back, eps, + sigma_val, dist_func, dist_eps, + gamma_val, aggr_func_rgb, aggr_func_alpha, + texture_type, bin_size, max_elems_per_bin, + max_faces_per_pixel_for_grad)(face_vertices, textures) \ No newline at end of file diff --git a/jrender/renderer/dr/dr_l/__init__.py b/jrender/renderer/dr/dr_l/__init__.py new file mode 100755 index 0000000..010314d --- /dev/null +++ b/jrender/renderer/dr/dr_l/__init__.py @@ -0,0 +1,2 @@ +from .rasterizer import * +from .DrL_rasterize import * \ No newline at end of file diff --git a/jrender/renderer/dr/dr_l/cuda/DrL_rasterize.py b/jrender/renderer/dr/dr_l/cuda/DrL_rasterize.py new file mode 100755 index 0000000..0fc9e4d --- /dev/null +++ b/jrender/renderer/dr/dr_l/cuda/DrL_rasterize.py @@ -0,0 +1,1008 @@ +import jittor as jt + +def forward_DrL_rasterize(face_vertices, textures, + faces_info, aggrs_info, + soft_colors, faces_id_buffer, + points, msk, + image_size, near, far, eps, + sigma_val, func_id_dist, dist_eps, + gamma_val, func_id_rgb, func_id_alpha, + texture_sample_type, double_side): + return jt.code([faces_info.shape, aggrs_info.shape, soft_colors.shape, faces_id_buffer.shape, points.shape, msk.shape], [faces_info.dtype, aggrs_info.dtype, soft_colors.dtype, faces_id_buffer.dtype, points.dtype, msk.dtype], + [face_vertices, textures], + cuda_header=''' + #include + #include + +#define kMaxPointsPerPixel 64 + +namespace{ + + template + __device__ __forceinline__ void barycentric_coordinate(scalar_t *w, const scalar_t x, const scalar_t y, const scalar_t *face_info) { + w[0] = face_info[3 * 0 + 0] * x + face_info[3 * 0 + 1] * y + face_info[3 * 0 + 2]; + w[1] = face_info[3 * 1 + 0] * x + face_info[3 * 1 + 1] * y + face_info[3 * 1 + 2]; + w[2] = face_info[3 * 2 + 0] * x + face_info[3 * 2 + 1] * y + face_info[3 * 2 + 2]; + } + + + template + __device__ __forceinline__ bool check_border(const scalar_t x, const scalar_t y, const scalar_t *face, const scalar_t threshold) { + return (x > max(max(face[0], face[3]), face[6]) + threshold || + x < min(min(face[0], face[3]), face[6]) - threshold || + y > max(max(face[1], face[4]), face[7]) + threshold || + y < min(min(face[1], face[4]), face[7]) - threshold); + } + + + template + __device__ __forceinline__ bool check_face_frontside(const scalar_t *face) { + return (face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0]); + } + + + template + __device__ __forceinline__ bool check_pixel_inside(const scalar_t *w) { + return w[0] <= 1 && w[0] >= 0 && w[1] <= 1 && w[1] >= 0 && w[2] <= 1 && w[2] >= 0; + } + + + template + __device__ __forceinline__ void barycentric_clip(scalar_t *w) { + for (int k = 0; k < 3; k++) w[k] = max(min(w[k], 1.), 0.); + const scalar_t w_sum = max(w[0] + w[1] + w[2], 1e-5); + for (int k = 0; k < 3; k++) w[k] /= w_sum; + } + + + template + __device__ __forceinline__ void euclidean_p2f_distance(scalar_t &sign, scalar_t &dis_x, scalar_t &dis_y, + scalar_t *w, scalar_t *t, + const scalar_t* face, const scalar_t *face_info, + const scalar_t xp, const scalar_t yp) { + const scalar_t *face_sym = face_info + 9; + const scalar_t *face_obt = face_info + 18; + + if (w[0] > 0 && w[1] > 0 && w[2] > 0 && + w[0] < 1 && w[1] < 1 && w[2] < 1) { + // inside the triangle, w[0] + w[1] + w[2] = 0 + scalar_t dis_min = 100000000; + scalar_t dis_x_min = 0; + scalar_t dis_y_min = 0; + scalar_t a0[3]; + scalar_t t0[3]; + for (int k = 0; k < 3; k++) { + int v0 = k; + int v1 = (k + 1) % 3; + int v2 = (k + 2) % 3; + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t0[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t0[v1] = 1 - t0[v0]; + t0[v2] = 0; + + t0[0] -= w[0]; + t0[1] -= w[1]; + t0[2] -= w[2]; + + // calculate distance + dis_x = t0[0] * face[0] + t0[1] * face[3] + t0[2] * face[6]; + dis_y = t0[0] * face[1] + t0[1] * face[4] + t0[2] * face[7]; + scalar_t dis = dis_x * dis_x + dis_y * dis_y; + + if (dis < dis_min) { + dis_min = dis; + dis_x_min = dis_x; + dis_y_min = dis_y; + t[0] = t0[0]; + t[1] = t0[1]; + t[2] = t0[2]; + } + } + dis_x = dis_x_min; + dis_y = dis_y_min; + sign = 1; + } else { + int v0 = -1; + + if (w[1] <= 0 && w[2] <= 0) { + v0 = 0; + if (face_obt[0] == 1 && (xp - face[0]) * (face[6] - face[0]) + (yp - face[1]) * (face[7] - face[1]) > 0) v0 = 2; + } else if (w[2] <= 0 && w[0] <= 0) { + v0 = 1; + if (face_obt[1] == 1 && (xp - face[3]) * (face[0] - face[3]) + (yp - face[4]) * (face[1] - face[4]) > 0) v0 = 0; + } else if (w[0] <= 0 && w[1] <= 0) { + v0 = 2; + if (face_obt[2] == 1 && (xp - face[6]) * (face[3] - face[6]) + (yp - face[7]) * (face[4] - face[7]) > 0) v0 = 1; + } else + if (w[0] <= 0) v0 = 1; + else if (w[1] <= 0) v0 = 2; + else if (w[2] <= 0) v0 = 0; + + const int v1 = (v0 + 1) % 3; + const int v2 = (v0 + 2) % 3; + + scalar_t a0[3]; + + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t[v1] = 1 - t[v0]; + t[v2] = 0; + + // clamp to [0, 1] + for (int k = 0; k < 3; k++) { + t[k] = min(max(t[k], 0.), 1.); + t[k] -= w[k]; + } + + // calculate distance + dis_x = t[0] * face[0] + t[1] * face[3] + t[2] * face[6]; + dis_y = t[0] * face[1] + t[1] * face[4] + t[2] * face[7]; + sign = -1; + } + } + + + template + __device__ __forceinline__ void forward_barycentric_p2f_distance(scalar_t &dis, const scalar_t *w) { + dis = w[0] > w[1] ? (w[1] > w[2] ? w[2] : w[1]) : (w[0] > w[2] ? w[2] : w[0]); + dis = dis > 0 ? dis*dis : -dis*dis; + } + + template + __device__ __forceinline__ scalar_t forward_sample_texture(const scalar_t *texture, const scalar_t *w, const int R, const int k, const int texture_sample_type, const scalar_t* face, const scalar_t z) { + scalar_t texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + texture_k = texture[(w_y * R + w_x) * 3 + k]; + } else { + texture_k = texture[((R - 1 - w_y) * R + (R - 1 - w_x)) * 3 + k]; + } + } else + if (texture_sample_type == 1) { // sample vertex color + texture_k = w[0] * texture[k] / face[2] + w[1] * texture[3 + k] / face[5] + w[2] * texture[6 + k] / face[8]; + texture_k *= z; + } + return texture_k; + } + + // triangle preprocessing + template + __global__ void forward_soft_rasterize_inv_cuda_kernel( + const scalar_t* __restrict__ faces, + scalar_t* faces_info, + int batch_size, + int num_faces, + int image_size) { + /* batch number, face, number, image size, face[v012][RGB] */ + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * num_faces) { + return; + } + // const int is = image_size; + const scalar_t* face = &faces[i * 9]; + scalar_t* face_inv = &faces_info[i * 27]; + scalar_t* face_sym = &faces_info[i * 27+9]; + scalar_t* face_obt = &faces_info[i * 27+18]; + + /* return if backside */ + // if ((face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0])) + // return; + /* p[num][xy]: x, y is (-1, 1). */ + scalar_t p[3][2]; + for (int num = 0; num < 3; num++) { + for (int dim = 0; dim < 2; dim++) { + p[num][dim] = face[3 * num + dim]; // no normalize + } + } + /* compute face_inv */ + scalar_t face_inv_star[9] = { + p[1][1] - p[2][1], p[2][0] - p[1][0], p[1][0] * p[2][1] - p[2][0] * p[1][1], + p[2][1] - p[0][1], p[0][0] - p[2][0], p[2][0] * p[0][1] - p[0][0] * p[2][1], + p[0][1] - p[1][1], p[1][0] - p[0][0], p[0][0] * p[1][1] - p[1][0] * p[0][1]}; + scalar_t face_inv_determinant = ( + p[2][0] * (p[0][1] - p[1][1]) + + p[0][0] * (p[1][1] - p[2][1]) + + p[1][0] * (p[2][1] - p[0][1])); + face_inv_determinant = face_inv_determinant > 0 ? max(face_inv_determinant, 1e-10) : min(face_inv_determinant, -1e-10); + /* set to global memory */ + for (int k = 0; k < 9; k++) { + face_inv[k] = face_inv_star[k] / face_inv_determinant; + } + /* F * F.T */ + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + face_sym[j * 3 + k] = face[j * 3 + 0] * face[k * 3 + 0] + + face[j * 3 + 1] * face[k * 3 + 1] + + 1; + } + } + /* check if one arc is obt arc */ + for (int k = 0; k < 3; k++) { + const int k0 = k; + const int k1 = (k + 1) % 3; + const int k2 = (k + 2) % 3; + if ((p[k1][0] - p[k0][0]) * (p[k2][0] - p[k0][0]) + (p[k1][1] - p[k0][1]) * (p[k2][1] - p[k0][1]) < 0) { + face_obt[k0] = 1; + break; + } + } + } + + struct Pixel{ + int id; + float z; + }; + + template + __global__ void forward_soft_rasterize_cuda_kernel( + const scalar_t* __restrict__ faces, + const scalar_t* __restrict__ textures, + const scalar_t* __restrict__ faces_info, + scalar_t* aggrs_info, + scalar_t* soft_colors, + int* faces_id_buffers, + scalar_t* points, + scalar_t* msk, + int batch_size, + int num_faces, + int image_size, + int max_faces_id, + int texture_size, + int texture_res, + float near, + float far, + float eps, + float sigma_val, + int func_id_dist, + float dist_eps, + float gamma_val, + int func_id_rgb, + int func_id_alpha, + int texture_sample_type, + int double_side) { + + //////////////////////// + //////////////////////// + + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * image_size * image_size) { + return; + } + const int is = image_size; + const int nf = num_faces; + const int bn = i / (is * is); + const int pn = i % (is * is); + const int yi = is - 1 - (pn / is); + const int xi = pn % is; + const scalar_t yp = (2. * yi + 1. - is) / is; + const scalar_t xp = (2. * xi + 1. - is) / is; + + points[(bn * 2 + 0) * (is * is) + pn] = xp; + points[(bn * 2 + 1) * (is * is) + pn] = yp; + + const scalar_t *face = &faces[bn * nf * 9] - 9; + const scalar_t *texture = &textures[bn * nf * texture_size * 3] - texture_size * 3; + const scalar_t *face_info = &faces_info[bn * nf * 27] - 27; + + const scalar_t threshold = dist_eps * sigma_val; + + // Initialize pixel color + scalar_t soft_color[4] = {1., 1., 1., 0.}; + if (func_id_alpha == 2) soft_color[3] = 1.; + scalar_t softmax_sum = exp(eps / gamma_val); + scalar_t softmax_max = eps; + for (int k = 0; k < 3; k++) { + if (func_id_rgb == 0) { // hard assign, set to background + soft_color[k] = soft_colors[(bn * 4 + k) * (is * is) + pn]; + } else + if (func_id_rgb == 1) { + soft_color[k] = soft_colors[(bn * 4 + k) * (is * is) + pn] * softmax_sum; // initialize background color + } + } + scalar_t depth_min = 10000000; + int face_index_min = -1; + Pixel q[kMaxPointsPerPixel]; + int q_size = 0; + float q_max_z = -1; + int q_max_id = -1; + + for (int fn = 0; fn < nf; fn++) { + face += 9; + texture += texture_size * 3; + face_info += 27; + + if (check_border(xp, yp, face, sqrt(threshold))) continue; // triangle too far away from pixel + + scalar_t dis; + scalar_t dis_x; + scalar_t dis_y; + scalar_t t[3]; + scalar_t w[3]; + scalar_t w_clip[3]; + scalar_t sign; + scalar_t soft_fragment; + + // compute barycentric coordinate w + barycentric_coordinate(w, xp, yp, face_info); + + // compute probability map based on distance functions + if (func_id_dist == 0) { // hard assign + soft_fragment = check_pixel_inside(w) ? 1. : 0.; + if (soft_fragment == 0.) continue; // ignore triangle outside of the pixel + } else + if (func_id_dist == 1) { // barycentric distance + forward_barycentric_p2f_distance(dis, w); + if (-dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-dis / sigma_val)); + } else + if (func_id_dist == 2) { // euclidean distance + euclidean_p2f_distance(sign, dis_x, dis_y, w, t, face, face_info, xp, yp); + dis = dis_x * dis_x + dis_y * dis_y; + if (sign < 0 && dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-sign * dis / sigma_val)); + } + + ///////////////////////////////////////////////////// + + // aggragate for alpha channel + if (func_id_alpha == 0) { // hard assign + if (soft_fragment > 0.5) soft_color[3] = 1.; + } else + if (func_id_alpha == 1) { // Sum + soft_color[3] += soft_fragment; + } else + if (func_id_alpha == 2) { // Logical-Or + soft_color[3] *= 1. - soft_fragment; + } + + ///////////////////////////////////////////////////// + + for (int k = 0; k < 3; k++) w_clip[k] = w[k]; + barycentric_clip(w_clip); + const scalar_t zp = 1. / (w_clip[0] / face[2] + w_clip[1] / face[5] + w_clip[2] / face[8]); + if (zp < near || zp > far) continue; // triangle out of screen, pass + +/////////////////////////////////////////////////// + // choose Topk + if (q_size < max_faces_id){ + q[q_size] = {fn,zp}; + if (zp > q_max_z){ + q_max_z = zp; + q_max_id = q_size; + } + q_size++; + } else if (zp < q_max_z){ + q[q_max_id] = {fn,zp}; + q_max_z = -1; + for(int k = 0; k < q_size; k++){ + if(q[k].z > q_max_z){ + q_max_z = q[k].z; + q_max_id = k; + } + } + } + + + ///////////////////////////////////////////////////// + if (zp < depth_min && check_pixel_inside(w) && (double_side || check_face_frontside(face))){ + points[(bn * 2 + 0) * (is * is) + pn] = w_clip[0]*face[0] + w_clip[1]*face[3] + w_clip[2]*face[6]; + points[(bn * 2 + 1) * (is * is) + pn] = w_clip[0]*face[1] + w_clip[1]*face[4] + w_clip[2]*face[7]; + msk[(bn * 1 + 0) * (is * is) + pn] = 1.0; + } + + // aggregate for rgb channels + if (func_id_rgb == 0) { // Hard assign + if (zp < depth_min && check_pixel_inside(w) && (double_side || check_face_frontside(face))) { + depth_min = zp; + face_index_min = fn; + for (int k = 0; k < 3; k++) { + soft_color[k] = forward_sample_texture(texture, w_clip, texture_res, k, texture_sample_type, face, zp); + } + } + } else + if (func_id_rgb == 1) { // D * Softmax (Z) + if (check_face_frontside(face) || double_side) { + const scalar_t zp_norm = (far - zp) / (far - near); + scalar_t exp_delta_zp = 1.; + if (zp_norm > softmax_max) { + exp_delta_zp = exp((softmax_max - zp_norm) / gamma_val); + softmax_max = zp_norm; + } + const scalar_t exp_z = exp((zp_norm - softmax_max) / gamma_val); + softmax_sum = exp_delta_zp * softmax_sum + exp_z * soft_fragment; + for (int k = 0; k < 3; k++) { + const scalar_t color_k = forward_sample_texture(texture, w_clip, texture_res, k, texture_sample_type, face, zp); + soft_color[k] = exp_delta_zp * soft_color[k] + exp_z * soft_fragment * color_k;// * soft_fragment; + if(isnan(color_k)){ + //printf("color_k: %f exp_z: %f soft_color: %f\\n",color_k,exp_z,soft_color[k]); + //printf("%f %f %f\\n",w_clip[0],w_clip[1],w_clip[2]); + //printf("zp: %f\\n",zp); + } + } + } + } + + } + + ////////////////////////////////////////////// + + // finalize aggregation + if (func_id_alpha == 0) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = soft_color[3]; + } else + if (func_id_alpha == 1) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = soft_color[3] / nf; + } else + if (func_id_alpha == 2) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = 1. - soft_color[3]; + } + + if (func_id_rgb == 0) { + if (face_index_min != -1) + for (int k = 0; k < 3; k++) { + soft_colors[(bn * 4 + k) * (is * is) + pn] = soft_color[k]; + } + aggrs_info[(bn * 2 + 0) * (is * is) + pn] = depth_min; + aggrs_info[(bn * 2 + 1) * (is * is) + pn] = face_index_min; + } else + if (func_id_rgb == 1) { + for (int k = 0; k < 3; k++) { + soft_colors[(bn * 4 + k) * (is * is) + pn] = soft_color[k] / softmax_sum; + if(isnan(soft_color[k])) + printf("i: %d xi: %d yi: %d soft_color: %f\\n",i,xi,yi,soft_color[k]); + } + aggrs_info[(bn * 2 + 0) * (is * is) + pn] = softmax_sum; + aggrs_info[(bn * 2 + 1) * (is * is) + pn] = softmax_max; + } + for (int k = 0; k < q_size; k++) { + faces_id_buffers[(bn * max_faces_id + k) * (is * is) + pn] = q[k].id; + } + } +} + ''', + cuda_src=f''' + @alias(faces, in0) + @alias(textures, in1) + @alias(faces_info, out0) + @alias(aggrs_info, out1) + @alias(soft_colors, out2) + @alias(faces_id_buffer, out3) + @alias(points, out4) + @alias(msk, out5) + + cudaMemsetAsync(out0_p, 0, out0->size); + cudaMemsetAsync(out1_p, 0, out1->size); + cudaMemsetAsync(out2_p, 0, out2->size); + cudaMemsetAsync(out3_p, -1, out3->size); + cudaMemsetAsync(out4_p, 0, out4->size); + cudaMemsetAsync(out5_p, 0, out5->size); + + const auto batch_size = faces_shape0; + const auto num_faces = faces_shape1; + const auto texture_size = textures_shape2; + const auto texture_res = int(sqrt(texture_size)); + const auto max_faces_id = faces_id_buffer_shape1; + const int threads = 512; + const dim3 blocks_1 ((batch_size * num_faces - 1) / threads +1); + + forward_soft_rasterize_inv_cuda_kernel<<>>( + faces_p, + faces_info_p, + batch_size, + num_faces, + {image_size}); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in forward_transform_inv_triangle: %s\\n", cudaGetErrorString(err)); + + const dim3 blocks_2 ((batch_size * {image_size} * {image_size} - 1) / threads +1); + + forward_soft_rasterize_cuda_kernel<<>>( + faces_p, + textures_p, + faces_info_p, + aggrs_info_p, + soft_colors_p, + faces_id_buffer_p, + points_p, + msk_p, + batch_size, + num_faces, + {image_size}, + max_faces_id, + texture_size, + texture_res, + {near}, + {far}, + {eps}, + {sigma_val}, + {func_id_dist}, + {dist_eps}, + {gamma_val}, + {func_id_rgb}, + {func_id_alpha}, + {texture_sample_type}, + {double_side}); + + err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in forward_soft_rasterize: %s\\n", cudaGetErrorString(err)); + ''') + +def backward_DrL_rasterize(faces, textures, soft_colors, points, + faces_info, aggrs_info, faces_id_buffer, + grad_faces, grad_textures, grad_soft_colors, grad_points, + image_size, near, far, eps, + sigma_val, func_id_dist, dist_eps, + gamma_val, func_id_rgb, func_id_alpha, + texture_sample_type, double_side): + return jt.code([grad_faces.shape, grad_textures.shape], [grad_faces.dtype, grad_textures.dtype], [faces, textures, soft_colors, points, + faces_info, aggrs_info, grad_soft_colors, faces_id_buffer, grad_points], + cuda_header=''' +#include +#include + +namespace{ + +template +__device__ __forceinline__ void barycentric_coordinate(scalar_t *w, const scalar_t x, const scalar_t y, const scalar_t *face_info) { + w[0] = face_info[3 * 0 + 0] * x + face_info[3 * 0 + 1] * y + face_info[3 * 0 + 2]; + w[1] = face_info[3 * 1 + 0] * x + face_info[3 * 1 + 1] * y + face_info[3 * 1 + 2]; + w[2] = face_info[3 * 2 + 0] * x + face_info[3 * 2 + 1] * y + face_info[3 * 2 + 2]; +} + + +template +__device__ __forceinline__ bool check_border(const scalar_t x, const scalar_t y, const scalar_t *face, const scalar_t threshold) { + return (x > max(max(face[0], face[3]), face[6]) + threshold || + x < min(min(face[0], face[3]), face[6]) - threshold || + y > max(max(face[1], face[4]), face[7]) + threshold || + y < min(min(face[1], face[4]), face[7]) - threshold); +} + + +template +__device__ __forceinline__ bool check_face_frontside(const scalar_t *face) { + return (face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0]); +} + + +template +__device__ __forceinline__ bool check_pixel_inside(const scalar_t *w) { + return w[0] <= 1 && w[0] >= 0 && w[1] <= 1 && w[1] >= 0 && w[2] <= 1 && w[2] >= 0; +} + + +template +__device__ __forceinline__ void barycentric_clip(scalar_t *w) { + for (int k = 0; k < 3; k++) w[k] = max(min(w[k], 1.), 0.); + const scalar_t w_sum = max(w[0] + w[1] + w[2], 1e-5); + for (int k = 0; k < 3; k++) w[k] /= w_sum; +} + + +template +__device__ __forceinline__ void euclidean_p2f_distance(scalar_t &sign, scalar_t &dis_x, scalar_t &dis_y, + scalar_t *w, scalar_t *t, + const scalar_t* face, const scalar_t *face_info, + const scalar_t xp, const scalar_t yp) { + const scalar_t *face_sym = face_info + 9; + const scalar_t *face_obt = face_info + 18; + + if (w[0] > 0 && w[1] > 0 && w[2] > 0 && + w[0] < 1 && w[1] < 1 && w[2] < 1) { + // inside the triangle, w[0] + w[1] + w[2] = 0 + scalar_t dis_min = 100000000; + scalar_t dis_x_min = 0; + scalar_t dis_y_min = 0; + scalar_t a0[3]; + scalar_t t0[3]; + for (int k = 0; k < 3; k++) { + int v0 = k; + int v1 = (k + 1) % 3; + int v2 = (k + 2) % 3; + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t0[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t0[v1] = 1 - t0[v0]; + t0[v2] = 0; + + t0[0] -= w[0]; + t0[1] -= w[1]; + t0[2] -= w[2]; + + // calculate distance + dis_x = t0[0] * face[0] + t0[1] * face[3] + t0[2] * face[6]; + dis_y = t0[0] * face[1] + t0[1] * face[4] + t0[2] * face[7]; + scalar_t dis = dis_x * dis_x + dis_y * dis_y; + + if (dis < dis_min) { + dis_min = dis; + dis_x_min = dis_x; + dis_y_min = dis_y; + t[0] = t0[0]; + t[1] = t0[1]; + t[2] = t0[2]; + } + } + dis_x = dis_x_min; + dis_y = dis_y_min; + sign = 1; + } else { + int v0 = -1; + + if (w[1] <= 0 && w[2] <= 0) { + v0 = 0; + if (face_obt[0] == 1 && (xp - face[0]) * (face[6] - face[0]) + (yp - face[1]) * (face[7] - face[1]) > 0) v0 = 2; + } else if (w[2] <= 0 && w[0] <= 0) { + v0 = 1; + if (face_obt[1] == 1 && (xp - face[3]) * (face[0] - face[3]) + (yp - face[4]) * (face[1] - face[4]) > 0) v0 = 0; + } else if (w[0] <= 0 && w[1] <= 0) { + v0 = 2; + if (face_obt[2] == 1 && (xp - face[6]) * (face[3] - face[6]) + (yp - face[7]) * (face[4] - face[7]) > 0) v0 = 1; + } else + if (w[0] <= 0) v0 = 1; + else if (w[1] <= 0) v0 = 2; + else if (w[2] <= 0) v0 = 0; + + const int v1 = (v0 + 1) % 3; + const int v2 = (v0 + 2) % 3; + + scalar_t a0[3]; + + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t[v1] = 1 - t[v0]; + t[v2] = 0; + + // clamp to [0, 1] + for (int k = 0; k < 3; k++) { + t[k] = min(max(t[k], 0.), 1.); + t[k] -= w[k]; + } + + // calculate distance + dis_x = t[0] * face[0] + t[1] * face[3] + t[2] * face[6]; + dis_y = t[0] * face[1] + t[1] * face[4] + t[2] * face[7]; + sign = -1; + } +} + + +template +__device__ __forceinline__ void forward_barycentric_p2f_distance(scalar_t &dis, const scalar_t *w) { + dis = w[0] > w[1] ? (w[1] > w[2] ? w[2] : w[1]) : (w[0] > w[2] ? w[2] : w[0]); + dis = dis > 0 ? dis*dis : -dis*dis; +} + + +template +__device__ __forceinline__ void backward_barycentric_p2f_distance(scalar_t grad_v[3][3], const scalar_t *w, const scalar_t *face_info, const scalar_t xp, const scalar_t yp, const scalar_t dis, const scalar_t C) { + const int p = w[0] > w[1] ? (w[1] > w[2] ? 2 : 1) : (w[0] > w[2] ? 2 : 0); + const scalar_t *face_inv = face_info; + for (int l = 0; l < 2; l++) { + for (int k = 0; k < 3; k++) { + scalar_t grad_kl = 0; + for (int q = 0; q < 3; q++) { + grad_kl += -face_inv[3*p+l] * face_inv[3*k+q] * (q == 0 ? xp : (q == 1 ? yp : 1)); + } + grad_v[k][l] = grad_kl * C; + grad_v[k][l] *= dis > 0 ? (2. * sqrt(dis)) : (2. * sqrt(-dis)); + } + } +} + + +template +__device__ __forceinline__ scalar_t forward_sample_texture(const scalar_t *texture, const scalar_t *w, const int R, const int k, const int texture_sample_type) { + scalar_t texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + texture_k = texture[(w_y * R + w_x) * 3 + k]; + } else { + texture_k = texture[((R - 1 - w_y) * R + (R - 1 - w_x)) * 3 + k]; + } + } else + if (texture_sample_type == 1) { // sample vertex color + texture_k = w[0] * texture[k] + w[1] * texture[3+k] + w[2] * texture[6+k]; + } + return texture_k; +} + + +template +__device__ __forceinline__ scalar_t backward_sample_texture(const scalar_t grad_color, const scalar_t *w, const int R, const int k, const int texture_sample_type) { + scalar_t grad_texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + if (k == w_y * R + w_x) { + grad_texture_k = grad_color; + } + } else { + if (k == (R - 1 - w_y) * R + (R - 1 - w_x)) { + grad_texture_k = grad_color; + } + } + } else + if (texture_sample_type == 1) { + grad_texture_k = w[k] * grad_color; + } + return grad_texture_k; +} + + +template +__global__ void backward_soft_rasterize_cuda_kernel( + const scalar_t* __restrict__ faces, + const int* __restrict__ faces_id_buffers, + const scalar_t* __restrict__ textures, + const scalar_t* __restrict__ soft_colors, + const scalar_t* __restrict__ points, + const scalar_t* __restrict__ faces_info, + const scalar_t* __restrict__ aggrs_info, // 0: sum, 1: max z*D + scalar_t* grad_faces, + scalar_t* grad_textures, + scalar_t* grad_soft_colors, + scalar_t* grad_points, + int batch_size, + int num_faces, + int image_size, + int max_faces_id, + int texture_size, + int texture_res, + float near, + float far, + float eps, + float sigma_val, + int func_id_dist, + float dist_eps, + float gamma_val, + int func_id_rgb, + int func_id_alpha, + int texture_sample_type, + bool double_side) { + + //////////////////////// + //////////////////////// + + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * image_size * image_size) { + return; + } + const int is = image_size; + const int nf = num_faces; + const int mf = max_faces_id; + const int bn = i / (is * is); + const int pn = i % (is * is); + const int yi = is - 1 - (pn / is); + const int xi = pn % is; + const scalar_t yp = (2. * yi + 1 - is) / is; + const scalar_t xp = (2. * xi + 1 - is) / is; + + const scalar_t* face; + const scalar_t* texture; + const scalar_t* face_info; + const int* faces_id_buffer = &faces_id_buffers[bn * is * is * mf + pn * mf]; + + const scalar_t threshold = dist_eps * sigma_val; + + const scalar_t softmax_sum = aggrs_info[(bn * 2 + 0) * (is * is) + pn]; + const scalar_t softmax_max = aggrs_info[(bn * 2 + 1) * (is * is) + pn]; + + for (int m = 0; m < mf; m++) { + int fn = faces_id_buffer[m]; + + if (fn == -1){ + break; + } + + face = &faces[(bn * nf + fn) * 9]; + texture = &textures[(bn * nf + fn) * texture_size * 3]; + face_info = &faces_info[(bn * nf + fn) * 27]; + + if (check_border(xp, yp, face, sqrt(threshold))) continue; + + scalar_t dis; + scalar_t dis_x; + scalar_t dis_y; + scalar_t t[3]; + scalar_t w[3]; + scalar_t w0[3]; + scalar_t sign; + scalar_t soft_fragment; + + barycentric_coordinate(w, xp, yp, face_info); + + // compute probability map based on distance functions + if (func_id_dist == 0) { // hard assign + soft_fragment = 1; + } else + if (func_id_dist == 1) { // barycentric distance + forward_barycentric_p2f_distance(dis, w); + for (int k = 0; k < 3; k++) t[k] = w[k]; + soft_fragment = 1. / (1. + exp(-dis / sigma_val)); + } else + if (func_id_dist == 2) { // euclidean distance + euclidean_p2f_distance(sign, dis_x, dis_y, w, t, face, face_info, xp, yp); + dis = dis_x * dis_x + dis_y * dis_y; + soft_fragment = 1. / (1. + exp(-sign * dis / sigma_val)); + } + + + scalar_t* grad_face = &grad_faces[(bn * nf + fn) * 9]; + scalar_t* grad_texture = &grad_textures[(bn * nf + fn) * texture_size * 3]; + scalar_t grad_v[3][3] = {0}; + scalar_t C_grad_xy = 0; + + ///////////////////////////////////////////////////// + + // aggragate for alpha channel + scalar_t C_grad_xy_alpha = grad_soft_colors[(bn * 4 + 3) * (is * is) + pn]; + if (func_id_alpha == 0) { // hard assign + // hard assign alpha channels does not have gradient + } else + if (func_id_alpha == 1) { // Sum + C_grad_xy_alpha /= nf; + } else + if (func_id_alpha == 2) { // Logical-Or + C_grad_xy_alpha *= (1 - soft_colors[(bn * 4 + 3) * (is * is) + pn]) / max(1 - soft_fragment, 1e-6); + } + C_grad_xy += C_grad_xy_alpha; + + ///////////////////////////////////////////////////// + for (int k = 0; k < 3; k++) w0[k] = w[k]; + barycentric_clip(w); + const scalar_t zp = 1. / (w[0] / face[2] + w[1] / face[5] + w[2] / face[8]); + + // aggregate for rgb channels + if (func_id_rgb == 0) { // Hard assign, no gradient to xyz + if (fn == softmax_max) { + for (int k = 0; k < 3; k++) { + for (int j = 0; j < texture_size; j++) { + atomicAdd(&grad_texture[3 * j + k], backward_sample_texture(grad_soft_colors[(bn * 4 + k) * (is * is) + pn], w, texture_res, j, texture_sample_type)); + } + } + } + } else + if (func_id_rgb == 1) { // Softmax (Z * D) + scalar_t C_grad_xyz_rgb = 0.; + + const scalar_t zp_norm = (far - zp) / (far - near); + const scalar_t zp_softmax = soft_fragment * exp((zp_norm - softmax_max) / gamma_val) / softmax_sum; + + for (int k = 0; k < 3; k++) { + const scalar_t grad_soft_color_k = grad_soft_colors[(bn * 4 + k) * (is * is) + pn]; + + for (int j = 0; j < texture_size; j++) { + const scalar_t grad_t = backward_sample_texture(grad_soft_color_k, w, texture_res, j, texture_sample_type); + atomicAdd(&grad_texture[3 * j + k], zp_softmax * grad_t); + } + + const scalar_t color_k = forward_sample_texture(texture, w, texture_res, k, texture_sample_type); + C_grad_xyz_rgb += grad_soft_color_k * (color_k - soft_colors[(bn * 4 + k) * (is * is) + pn]); + } + C_grad_xyz_rgb *= zp_softmax; + C_grad_xy += C_grad_xyz_rgb / soft_fragment; + + const scalar_t C_grad_z_rgb = C_grad_xyz_rgb / gamma_val / (near - far) * zp * zp; + grad_v[0][2] = C_grad_z_rgb * w[0] / face[2] / face[2]; + grad_v[1][2] = C_grad_z_rgb * w[1] / face[5] / face[5]; + grad_v[2][2] = C_grad_z_rgb * w[2] / face[8] / face[8]; + } + + ///////////////////////////////////////////////////// + + C_grad_xy *= soft_fragment * (1 - soft_fragment) / sigma_val; // sigmoid gradient + // compute probability map gradient based on distance functions + if (func_id_dist == 1) { // barycentric distance + backward_barycentric_p2f_distance(grad_v, t, face_info, xp, yp, dis, C_grad_xy); + } else + if (func_id_dist == 2) { // euclidean distance + for (int k = 0; k < 3; k++) { + for (int l = 0; l < 2; l++) { + grad_v[k][l] = 2 * sign * C_grad_xy * (t[k] + w0[k]) * (l == 0 ? dis_x : dis_y); + } + } + } + + const scalar_t grad_px = grad_points[(bn * 2 + 0) * (is * is) + pn]; + const scalar_t grad_py = grad_points[(bn * 2 + 1) * (is * is) + pn]; + + grad_v[0][0] += grad_px*w[0] / face[2] / face[2]; + grad_v[0][1] += grad_py*w[0] / face[2] / face[2]; + grad_v[1][0] += grad_px*w[1] / face[5] / face[5]; + grad_v[1][1] += grad_py*w[1] / face[5] / face[5]; + grad_v[2][0] += grad_px*w[2] / face[8] / face[8]; + grad_v[2][1] += grad_py*w[2] / face[8] / face[8]; + + atomicAdd(&grad_face[0], grad_v[0][0]); + atomicAdd(&grad_face[1], grad_v[0][1]); + atomicAdd(&grad_face[3], grad_v[1][0]); + atomicAdd(&grad_face[4], grad_v[1][1]); + atomicAdd(&grad_face[6], grad_v[2][0]); + atomicAdd(&grad_face[7], grad_v[2][1]); + + atomicAdd(&grad_face[2], grad_v[0][2]); + atomicAdd(&grad_face[5], grad_v[1][2]); + atomicAdd(&grad_face[8], grad_v[2][2]); + } +} +} + ''', + cuda_src=f''' + @alias(faces, in0) + @alias(textures, in1) + @alias(soft_colors, in2) + @alias(points, in3) + @alias(faces_info, in4) + @alias(aggrs_info, in5) + @alias(grad_soft_colors, in6) + @alias(faces_id_buffer,in7) + @alias(grad_points, in8) + @alias(grad_faces, out0) + @alias(grad_textures, out1) + + cudaMemsetAsync(out0_p, 0, out0->size); + cudaMemsetAsync(out1_p, 0, out1->size); + + const auto batch_size = faces_shape0; + const auto num_faces = faces_shape1; + const auto texture_size = textures_shape2; + const auto texture_res = int(sqrt(texture_size)); + const auto max_faces_id = faces_id_buffer_shape3; + const int threads = 512; + const dim3 blocks ((batch_size * {image_size} * {image_size} - 1) / threads + 1); + + backward_soft_rasterize_cuda_kernel<<>>( + faces_p, + faces_id_buffer_p, + textures_p, + soft_colors_p, + points_p, + faces_info_p, + aggrs_info_p, + grad_faces_p, + grad_textures_p, + grad_soft_colors_p, + grad_points_p, + batch_size, + num_faces, + {image_size}, + max_faces_id, + texture_size, + texture_res, + {near}, + {far}, + {eps}, + {sigma_val}, + {func_id_dist}, + {dist_eps}, + {gamma_val}, + {func_id_rgb}, + {func_id_alpha}, + {texture_sample_type}, + {double_side}); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in backward_soft_rasterize: %s", cudaGetErrorString(err)); + ''') + diff --git a/jrender/renderer/dr/dr_l/cuda/backward_old.py b/jrender/renderer/dr/dr_l/cuda/backward_old.py new file mode 100755 index 0000000..b8dc1e7 --- /dev/null +++ b/jrender/renderer/dr/dr_l/cuda/backward_old.py @@ -0,0 +1,1013 @@ +import jittor as jt + +def forward_DrL_rasterize(face_vertices, textures, + faces_info, aggrs_info, + soft_colors, faces_id_buffer, + points, msk, + image_size, near, far, eps, + sigma_val, func_id_dist, dist_eps, + gamma_val, func_id_rgb, func_id_alpha, + texture_sample_type, double_side): + return jt.code([faces_info.shape, aggrs_info.shape, soft_colors.shape, faces_id_buffer.shape, points.shape, msk.shape], [faces_info.dtype, aggrs_info.dtype, soft_colors.dtype, faces_id_buffer.dtype, points.dtype, msk.dtype], + [face_vertices, textures], + cuda_header=''' + #include + #include + +#define kMaxPointsPerPixel 64 + +namespace{ + + template + __device__ __forceinline__ void barycentric_coordinate(scalar_t *w, const scalar_t x, const scalar_t y, const scalar_t *face_info) { + w[0] = face_info[3 * 0 + 0] * x + face_info[3 * 0 + 1] * y + face_info[3 * 0 + 2]; + w[1] = face_info[3 * 1 + 0] * x + face_info[3 * 1 + 1] * y + face_info[3 * 1 + 2]; + w[2] = face_info[3 * 2 + 0] * x + face_info[3 * 2 + 1] * y + face_info[3 * 2 + 2]; + } + + + template + __device__ __forceinline__ bool check_border(const scalar_t x, const scalar_t y, const scalar_t *face, const scalar_t threshold) { + return (x > max(max(face[0], face[3]), face[6]) + threshold || + x < min(min(face[0], face[3]), face[6]) - threshold || + y > max(max(face[1], face[4]), face[7]) + threshold || + y < min(min(face[1], face[4]), face[7]) - threshold); + } + + + template + __device__ __forceinline__ bool check_face_frontside(const scalar_t *face) { + return (face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0]); + } + + + template + __device__ __forceinline__ bool check_pixel_inside(const scalar_t *w) { + return w[0] <= 1 && w[0] >= 0 && w[1] <= 1 && w[1] >= 0 && w[2] <= 1 && w[2] >= 0; + } + + + template + __device__ __forceinline__ void barycentric_clip(scalar_t *w) { + for (int k = 0; k < 3; k++) w[k] = max(min(w[k], 1.), 0.); + const scalar_t w_sum = max(w[0] + w[1] + w[2], 1e-5); + for (int k = 0; k < 3; k++) w[k] /= w_sum; + } + + + template + __device__ __forceinline__ void euclidean_p2f_distance(scalar_t &sign, scalar_t &dis_x, scalar_t &dis_y, + scalar_t *w, scalar_t *t, + const scalar_t* face, const scalar_t *face_info, + const scalar_t xp, const scalar_t yp) { + const scalar_t *face_sym = face_info + 9; + const scalar_t *face_obt = face_info + 18; + + if (w[0] > 0 && w[1] > 0 && w[2] > 0 && + w[0] < 1 && w[1] < 1 && w[2] < 1) { + // inside the triangle, w[0] + w[1] + w[2] = 0 + scalar_t dis_min = 100000000; + scalar_t dis_x_min = 0; + scalar_t dis_y_min = 0; + scalar_t a0[3]; + scalar_t t0[3]; + for (int k = 0; k < 3; k++) { + int v0 = k; + int v1 = (k + 1) % 3; + int v2 = (k + 2) % 3; + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t0[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t0[v1] = 1 - t0[v0]; + t0[v2] = 0; + + t0[0] -= w[0]; + t0[1] -= w[1]; + t0[2] -= w[2]; + + // calculate distance + dis_x = t0[0] * face[0] + t0[1] * face[3] + t0[2] * face[6]; + dis_y = t0[0] * face[1] + t0[1] * face[4] + t0[2] * face[7]; + scalar_t dis = dis_x * dis_x + dis_y * dis_y; + + if (dis < dis_min) { + dis_min = dis; + dis_x_min = dis_x; + dis_y_min = dis_y; + t[0] = t0[0]; + t[1] = t0[1]; + t[2] = t0[2]; + } + } + dis_x = dis_x_min; + dis_y = dis_y_min; + sign = 1; + } else { + int v0 = -1; + + if (w[1] <= 0 && w[2] <= 0) { + v0 = 0; + if (face_obt[0] == 1 && (xp - face[0]) * (face[6] - face[0]) + (yp - face[1]) * (face[7] - face[1]) > 0) v0 = 2; + } else if (w[2] <= 0 && w[0] <= 0) { + v0 = 1; + if (face_obt[1] == 1 && (xp - face[3]) * (face[0] - face[3]) + (yp - face[4]) * (face[1] - face[4]) > 0) v0 = 0; + } else if (w[0] <= 0 && w[1] <= 0) { + v0 = 2; + if (face_obt[2] == 1 && (xp - face[6]) * (face[3] - face[6]) + (yp - face[7]) * (face[4] - face[7]) > 0) v0 = 1; + } else + if (w[0] <= 0) v0 = 1; + else if (w[1] <= 0) v0 = 2; + else if (w[2] <= 0) v0 = 0; + + const int v1 = (v0 + 1) % 3; + const int v2 = (v0 + 2) % 3; + + scalar_t a0[3]; + + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t[v1] = 1 - t[v0]; + t[v2] = 0; + + // clamp to [0, 1] + for (int k = 0; k < 3; k++) { + t[k] = min(max(t[k], 0.), 1.); + t[k] -= w[k]; + } + + // calculate distance + dis_x = t[0] * face[0] + t[1] * face[3] + t[2] * face[6]; + dis_y = t[0] * face[1] + t[1] * face[4] + t[2] * face[7]; + sign = -1; + } + } + + + template + __device__ __forceinline__ void forward_barycentric_p2f_distance(scalar_t &dis, const scalar_t *w) { + dis = w[0] > w[1] ? (w[1] > w[2] ? w[2] : w[1]) : (w[0] > w[2] ? w[2] : w[0]); + dis = dis > 0 ? dis*dis : -dis*dis; + } + + template + __device__ __forceinline__ scalar_t forward_sample_texture(const scalar_t *texture, const scalar_t *w, const int R, const int k, const int texture_sample_type, const scalar_t* face, const scalar_t z) { + scalar_t texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + texture_k = texture[(w_y * R + w_x) * 3 + k]; + } else { + texture_k = texture[((R - 1 - w_y) * R + (R - 1 - w_x)) * 3 + k]; + } + } else + if (texture_sample_type == 1) { // sample vertex color + texture_k = w[0] * texture[k] / face[2] + w[1] * texture[3 + k] / face[5] + w[2] * texture[6 + k] / face[8]; + texture_k *= z; + } + return texture_k; + } + + // triangle preprocessing + template + __global__ void forward_soft_rasterize_inv_cuda_kernel( + const scalar_t* __restrict__ faces, + scalar_t* faces_info, + int batch_size, + int num_faces, + int image_size) { + /* batch number, face, number, image size, face[v012][RGB] */ + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * num_faces) { + return; + } + // const int is = image_size; + const scalar_t* face = &faces[i * 9]; + scalar_t* face_inv = &faces_info[i * 27]; + scalar_t* face_sym = &faces_info[i * 27+9]; + scalar_t* face_obt = &faces_info[i * 27+18]; + + /* return if backside */ + // if ((face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0])) + // return; + /* p[num][xy]: x, y is (-1, 1). */ + scalar_t p[3][2]; + for (int num = 0; num < 3; num++) { + for (int dim = 0; dim < 2; dim++) { + p[num][dim] = face[3 * num + dim]; // no normalize + } + } + /* compute face_inv */ + scalar_t face_inv_star[9] = { + p[1][1] - p[2][1], p[2][0] - p[1][0], p[1][0] * p[2][1] - p[2][0] * p[1][1], + p[2][1] - p[0][1], p[0][0] - p[2][0], p[2][0] * p[0][1] - p[0][0] * p[2][1], + p[0][1] - p[1][1], p[1][0] - p[0][0], p[0][0] * p[1][1] - p[1][0] * p[0][1]}; + scalar_t face_inv_determinant = ( + p[2][0] * (p[0][1] - p[1][1]) + + p[0][0] * (p[1][1] - p[2][1]) + + p[1][0] * (p[2][1] - p[0][1])); + face_inv_determinant = face_inv_determinant > 0 ? max(face_inv_determinant, 1e-10) : min(face_inv_determinant, -1e-10); + /* set to global memory */ + for (int k = 0; k < 9; k++) { + face_inv[k] = face_inv_star[k] / face_inv_determinant; + } + /* F * F.T */ + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + face_sym[j * 3 + k] = face[j * 3 + 0] * face[k * 3 + 0] + + face[j * 3 + 1] * face[k * 3 + 1] + + 1; + } + } + /* check if one arc is obt arc */ + for (int k = 0; k < 3; k++) { + const int k0 = k; + const int k1 = (k + 1) % 3; + const int k2 = (k + 2) % 3; + if ((p[k1][0] - p[k0][0]) * (p[k2][0] - p[k0][0]) + (p[k1][1] - p[k0][1]) * (p[k2][1] - p[k0][1]) < 0) { + face_obt[k0] = 1; + break; + } + } + } + + struct Pixel{ + int id; + float z; + }; + + template + __global__ void forward_soft_rasterize_cuda_kernel( + const scalar_t* __restrict__ faces, + const scalar_t* __restrict__ textures, + const scalar_t* __restrict__ faces_info, + scalar_t* aggrs_info, + scalar_t* soft_colors, + int* faces_id_buffers, + scalar_t* points, + scalar_t* msk, + int batch_size, + int num_faces, + int image_size, + int max_faces_id, + int texture_size, + int texture_res, + float near, + float far, + float eps, + float sigma_val, + int func_id_dist, + float dist_eps, + float gamma_val, + int func_id_rgb, + int func_id_alpha, + int texture_sample_type, + int double_side) { + + //////////////////////// + //////////////////////// + + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * image_size * image_size) { + return; + } + const int is = image_size; + const int nf = num_faces; + const int bn = i / (is * is); + const int pn = i % (is * is); + const int yi = is - 1 - (pn / is); + const int xi = pn % is; + const scalar_t yp = (2. * yi + 1. - is) / is; + const scalar_t xp = (2. * xi + 1. - is) / is; + + points[(bn * 2 + 0) * (is * is) + pn] = xp; + points[(bn * 2 + 1) * (is * is) + pn] = yp; + + const scalar_t *face = &faces[bn * nf * 9] - 9; + const scalar_t *texture = &textures[bn * nf * texture_size * 3] - texture_size * 3; + const scalar_t *face_info = &faces_info[bn * nf * 27] - 27; + + const scalar_t threshold = dist_eps * sigma_val; + + // Initialize pixel color + scalar_t soft_color[4] = {1., 1., 1., 0.}; + if (func_id_alpha == 2) soft_color[3] = 1.; + scalar_t softmax_sum = exp(eps / gamma_val); + scalar_t softmax_max = eps; + for (int k = 0; k < 3; k++) { + if (func_id_rgb == 0) { // hard assign, set to background + soft_color[k] = soft_colors[(bn * 4 + k) * (is * is) + pn]; + } else + if (func_id_rgb == 1) { + soft_color[k] = soft_colors[(bn * 4 + k) * (is * is) + pn] * softmax_sum; // initialize background color + } + } + scalar_t depth_min = 10000000; + int face_index_min = -1; + Pixel q[kMaxPointsPerPixel]; + int q_size = 0; + float q_max_z = -1; + int q_max_id = -1; + + for (int fn = 0; fn < nf; fn++) { + face += 9; + texture += texture_size * 3; + face_info += 27; + + if (check_border(xp, yp, face, sqrt(threshold))) continue; // triangle too far away from pixel + + scalar_t dis; + scalar_t dis_x; + scalar_t dis_y; + scalar_t t[3]; + scalar_t w[3]; + scalar_t w_clip[3]; + scalar_t sign; + scalar_t soft_fragment; + + // compute barycentric coordinate w + barycentric_coordinate(w, xp, yp, face_info); + + // compute probability map based on distance functions + if (func_id_dist == 0) { // hard assign + soft_fragment = check_pixel_inside(w) ? 1. : 0.; + if (soft_fragment == 0.) continue; // ignore triangle outside of the pixel + } else + if (func_id_dist == 1) { // barycentric distance + forward_barycentric_p2f_distance(dis, w); + if (-dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-dis / sigma_val)); + } else + if (func_id_dist == 2) { // euclidean distance + euclidean_p2f_distance(sign, dis_x, dis_y, w, t, face, face_info, xp, yp); + dis = dis_x * dis_x + dis_y * dis_y; + if (sign < 0 && dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-sign * dis / sigma_val)); + } + + ///////////////////////////////////////////////////// + + // aggragate for alpha channel + if (func_id_alpha == 0) { // hard assign + if (soft_fragment > 0.5) soft_color[3] = 1.; + } else + if (func_id_alpha == 1) { // Sum + soft_color[3] += soft_fragment; + } else + if (func_id_alpha == 2) { // Logical-Or + soft_color[3] *= 1. - soft_fragment; + } + + ///////////////////////////////////////////////////// + + for (int k = 0; k < 3; k++) w_clip[k] = w[k]; + barycentric_clip(w_clip); + const scalar_t zp = 1. / (w_clip[0] / face[2] + w_clip[1] / face[5] + w_clip[2] / face[8]); + if (zp < near || zp > far) continue; // triangle out of screen, pass + +/////////////////////////////////////////////////// + // choose Topk + if (q_size < max_faces_id){ + q[q_size] = {fn,zp}; + if (zp > q_max_z){ + q_max_z = zp; + q_max_id = q_size; + } + q_size++; + } else if (zp < q_max_z){ + q[q_max_id] = {fn,zp}; + q_max_z = -1; + for(int k = 0; k < q_size; k++){ + if(q[k].z > q_max_z){ + q_max_z = q[k].z; + q_max_id = k; + } + } + } + + + ///////////////////////////////////////////////////// + if (zp < depth_min && check_pixel_inside(w) && (double_side || check_face_frontside(face))){ + points[(bn * 2 + 0) * (is * is) + pn] = w_clip[0]*face[0] + w_clip[1]*face[3] + w_clip[2]*face[6]; + points[(bn * 2 + 1) * (is * is) + pn] = w_clip[0]*face[1] + w_clip[1]*face[4] + w_clip[2]*face[7]; + msk[(bn * 1 + 0) * (is * is) + pn] = 1.0; + } + + // aggregate for rgb channels + if (func_id_rgb == 0) { // Hard assign + if (zp < depth_min && check_pixel_inside(w) && (double_side || check_face_frontside(face))) { + depth_min = zp; + face_index_min = fn; + for (int k = 0; k < 3; k++) { + soft_color[k] = forward_sample_texture(texture, w_clip, texture_res, k, texture_sample_type, face, zp); + } + } + } else + if (func_id_rgb == 1) { // D * Softmax (Z) + if (check_face_frontside(face) || double_side) { + const scalar_t zp_norm = (far - zp) / (far - near); + scalar_t exp_delta_zp = 1.; + if (zp_norm > softmax_max) { + exp_delta_zp = exp((softmax_max - zp_norm) / gamma_val); + softmax_max = zp_norm; + } + const scalar_t exp_z = exp((zp_norm - softmax_max) / gamma_val); + softmax_sum = exp_delta_zp * softmax_sum + exp_z * soft_fragment; + for (int k = 0; k < 3; k++) { + const scalar_t color_k = forward_sample_texture(texture, w_clip, texture_res, k, texture_sample_type, face, zp); + soft_color[k] = exp_delta_zp * soft_color[k] + exp_z * soft_fragment * color_k;// * soft_fragment; + if(isnan(color_k)){ + //printf("color_k: %f exp_z: %f soft_color: %f\\n",color_k,exp_z,soft_color[k]); + //printf("%f %f %f\\n",w_clip[0],w_clip[1],w_clip[2]); + //printf("zp: %f\\n",zp); + } + } + } + } + + } + + ////////////////////////////////////////////// + + // finalize aggregation + if (func_id_alpha == 0) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = soft_color[3]; + } else + if (func_id_alpha == 1) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = soft_color[3] / nf; + } else + if (func_id_alpha == 2) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = 1. - soft_color[3]; + } + + if (func_id_rgb == 0) { + if (face_index_min != -1) + for (int k = 0; k < 3; k++) { + soft_colors[(bn * 4 + k) * (is * is) + pn] = soft_color[k]; + } + aggrs_info[(bn * 2 + 0) * (is * is) + pn] = depth_min; + aggrs_info[(bn * 2 + 1) * (is * is) + pn] = face_index_min; + } else + if (func_id_rgb == 1) { + for (int k = 0; k < 3; k++) { + soft_colors[(bn * 4 + k) * (is * is) + pn] = soft_color[k] / softmax_sum; + if(isnan(soft_color[k])) + printf("i: %d xi: %d yi: %d soft_color: %f\\n",i,xi,yi,soft_color[k]); + } + aggrs_info[(bn * 2 + 0) * (is * is) + pn] = softmax_sum; + aggrs_info[(bn * 2 + 1) * (is * is) + pn] = softmax_max; + } + for (int k = 0; k < q_size; k++) { + faces_id_buffers[(bn * max_faces_id + k) * (is * is) + pn] = q[k].id; + } + } +} + ''', + cuda_src=f''' + @alias(faces, in0) + @alias(textures, in1) + @alias(faces_info, out0) + @alias(aggrs_info, out1) + @alias(soft_colors, out2) + @alias(faces_id_buffer, out3) + @alias(points, out4) + @alias(msk, out5) + + cudaMemsetAsync(out0_p, 0, out0->size); + cudaMemsetAsync(out1_p, 0, out1->size); + cudaMemsetAsync(out2_p, 0, out2->size); + cudaMemsetAsync(out3_p, -1, out3->size); + cudaMemsetAsync(out4_p, 0, out4->size); + cudaMemsetAsync(out5_p, 0, out5->size); + + const auto batch_size = faces_shape0; + const auto num_faces = faces_shape1; + const auto texture_size = textures_shape2; + const auto texture_res = int(sqrt(texture_size)); + const auto max_faces_id = faces_id_buffer_shape1; + const int threads = 512; + const dim3 blocks_1 ((batch_size * num_faces - 1) / threads +1); + + forward_soft_rasterize_inv_cuda_kernel<<>>( + faces_p, + faces_info_p, + batch_size, + num_faces, + {image_size}); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in forward_transform_inv_triangle: %s\\n", cudaGetErrorString(err)); + + const dim3 blocks_2 ((batch_size * {image_size} * {image_size} - 1) / threads +1); + + forward_soft_rasterize_cuda_kernel<<>>( + faces_p, + textures_p, + faces_info_p, + aggrs_info_p, + soft_colors_p, + faces_id_buffer_p, + points_p, + msk_p, + batch_size, + num_faces, + {image_size}, + max_faces_id, + texture_size, + texture_res, + {near}, + {far}, + {eps}, + {sigma_val}, + {func_id_dist}, + {dist_eps}, + {gamma_val}, + {func_id_rgb}, + {func_id_alpha}, + {texture_sample_type}, + {double_side}); + + err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in forward_soft_rasterize: %s\\n", cudaGetErrorString(err)); + ''') + +def backward_DrL_rasterize(faces, textures, soft_colors, points, + faces_info, aggrs_info, + grad_faces, grad_textures, grad_soft_colors, grad_points, + image_size, near, far, eps, + sigma_val, func_id_dist, dist_eps, + gamma_val, func_id_rgb, func_id_alpha, + texture_sample_type, double_side): + return jt.code([grad_faces.shape, grad_textures.shape], [grad_faces.dtype, grad_textures.dtype], [faces, textures, soft_colors, points, + faces_info, aggrs_info, grad_soft_colors, grad_points], + cuda_header=''' +#include +#include + +// for the older gpus atomicAdd with double arguments does not exist +#if __CUDA_ARCH__ < 600 and defined(__CUDA_ARCH__) +static __inline__ __device__ double atomicAdd(double* address, double val) { + unsigned long long int* address_as_ull = (unsigned long long int*)address; + unsigned long long int old = *address_as_ull, assumed; + do { + assumed = old; + old = atomicCAS(address_as_ull, assumed, + __double_as_longlong(val + __longlong_as_double(assumed))); + // Note: uses integer comparison to avoid hang in case of NaN (since NaN != NaN) } while (assumed != old); + } while (assumed != old); + return __longlong_as_double(old); +} +#endif + + +namespace{ + +template +__device__ __forceinline__ void barycentric_coordinate(scalar_t *w, const scalar_t x, const scalar_t y, const scalar_t *face_info) { + w[0] = face_info[3 * 0 + 0] * x + face_info[3 * 0 + 1] * y + face_info[3 * 0 + 2]; + w[1] = face_info[3 * 1 + 0] * x + face_info[3 * 1 + 1] * y + face_info[3 * 1 + 2]; + w[2] = face_info[3 * 2 + 0] * x + face_info[3 * 2 + 1] * y + face_info[3 * 2 + 2]; +} + + +template +__device__ __forceinline__ bool check_border(const scalar_t x, const scalar_t y, const scalar_t *face, const scalar_t threshold) { + return (x > max(max(face[0], face[3]), face[6]) + threshold || + x < min(min(face[0], face[3]), face[6]) - threshold || + y > max(max(face[1], face[4]), face[7]) + threshold || + y < min(min(face[1], face[4]), face[7]) - threshold); +} + + +template +__device__ __forceinline__ bool check_face_frontside(const scalar_t *face) { + return (face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0]); +} + + +template +__device__ __forceinline__ bool check_pixel_inside(const scalar_t *w) { + return w[0] <= 1 && w[0] >= 0 && w[1] <= 1 && w[1] >= 0 && w[2] <= 1 && w[2] >= 0; +} + + +template +__device__ __forceinline__ void barycentric_clip(scalar_t *w) { + for (int k = 0; k < 3; k++) w[k] = max(min(w[k], 1.), 0.); + const scalar_t w_sum = max(w[0] + w[1] + w[2], 1e-5); + for (int k = 0; k < 3; k++) w[k] /= w_sum; +} + + +template +__device__ __forceinline__ void euclidean_p2f_distance(scalar_t &sign, scalar_t &dis_x, scalar_t &dis_y, + scalar_t *w, scalar_t *t, + const scalar_t* face, const scalar_t *face_info, + const scalar_t xp, const scalar_t yp) { + const scalar_t *face_sym = face_info + 9; + const scalar_t *face_obt = face_info + 18; + + if (w[0] > 0 && w[1] > 0 && w[2] > 0 && + w[0] < 1 && w[1] < 1 && w[2] < 1) { + // inside the triangle, w[0] + w[1] + w[2] = 0 + scalar_t dis_min = 100000000; + scalar_t dis_x_min = 0; + scalar_t dis_y_min = 0; + scalar_t a0[3]; + scalar_t t0[3]; + for (int k = 0; k < 3; k++) { + int v0 = k; + int v1 = (k + 1) % 3; + int v2 = (k + 2) % 3; + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t0[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t0[v1] = 1 - t0[v0]; + t0[v2] = 0; + + t0[0] -= w[0]; + t0[1] -= w[1]; + t0[2] -= w[2]; + + // calculate distance + dis_x = t0[0] * face[0] + t0[1] * face[3] + t0[2] * face[6]; + dis_y = t0[0] * face[1] + t0[1] * face[4] + t0[2] * face[7]; + scalar_t dis = dis_x * dis_x + dis_y * dis_y; + + if (dis < dis_min) { + dis_min = dis; + dis_x_min = dis_x; + dis_y_min = dis_y; + t[0] = t0[0]; + t[1] = t0[1]; + t[2] = t0[2]; + } + } + dis_x = dis_x_min; + dis_y = dis_y_min; + sign = 1; + } else { + int v0 = -1; + + if (w[1] <= 0 && w[2] <= 0) { + v0 = 0; + if (face_obt[0] == 1 && (xp - face[0]) * (face[6] - face[0]) + (yp - face[1]) * (face[7] - face[1]) > 0) v0 = 2; + } else if (w[2] <= 0 && w[0] <= 0) { + v0 = 1; + if (face_obt[1] == 1 && (xp - face[3]) * (face[0] - face[3]) + (yp - face[4]) * (face[1] - face[4]) > 0) v0 = 0; + } else if (w[0] <= 0 && w[1] <= 0) { + v0 = 2; + if (face_obt[2] == 1 && (xp - face[6]) * (face[3] - face[6]) + (yp - face[7]) * (face[4] - face[7]) > 0) v0 = 1; + } else + if (w[0] <= 0) v0 = 1; + else if (w[1] <= 0) v0 = 2; + else if (w[2] <= 0) v0 = 0; + + const int v1 = (v0 + 1) % 3; + const int v2 = (v0 + 2) % 3; + + scalar_t a0[3]; + + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t[v1] = 1 - t[v0]; + t[v2] = 0; + + // clamp to [0, 1] + for (int k = 0; k < 3; k++) { + t[k] = min(max(t[k], 0.), 1.); + t[k] -= w[k]; + } + + // calculate distance + dis_x = t[0] * face[0] + t[1] * face[3] + t[2] * face[6]; + dis_y = t[0] * face[1] + t[1] * face[4] + t[2] * face[7]; + sign = -1; + } +} + + +template +__device__ __forceinline__ void forward_barycentric_p2f_distance(scalar_t &dis, const scalar_t *w) { + dis = w[0] > w[1] ? (w[1] > w[2] ? w[2] : w[1]) : (w[0] > w[2] ? w[2] : w[0]); + dis = dis > 0 ? dis*dis : -dis*dis; +} + + +template +__device__ __forceinline__ void backward_barycentric_p2f_distance(scalar_t grad_v[3][3], const scalar_t *w, const scalar_t *face_info, const scalar_t xp, const scalar_t yp, const scalar_t dis, const scalar_t C) { + const int p = w[0] > w[1] ? (w[1] > w[2] ? 2 : 1) : (w[0] > w[2] ? 2 : 0); + const scalar_t *face_inv = face_info; + for (int l = 0; l < 2; l++) { + for (int k = 0; k < 3; k++) { + scalar_t grad_kl = 0; + for (int q = 0; q < 3; q++) { + grad_kl += -face_inv[3*p+l] * face_inv[3*k+q] * (q == 0 ? xp : (q == 1 ? yp : 1)); + } + grad_v[k][l] = grad_kl * C; + grad_v[k][l] *= dis > 0 ? (2. * sqrt(dis)) : (2. * sqrt(-dis)); + } + } +} + + +template +__device__ __forceinline__ scalar_t forward_sample_texture(const scalar_t *texture, const scalar_t *w, const int R, const int k, const int texture_sample_type) { + scalar_t texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = w[0] * R; + const int w_y = w[1] * R; + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + texture_k = texture[(w_y * R + w_x) * 3 + k]; + } else { + texture_k = texture[((R - 1 - w_y) * R + (R - 1 - w_x)) * 3 + k]; + } + } else + if (texture_sample_type == 1) { // sample vertex color + texture_k = w[0] * texture[k] + w[1] * texture[3+k] + w[2] * texture[6+k]; + } + return texture_k; +} + + +template +__device__ __forceinline__ scalar_t backward_sample_texture(const scalar_t grad_color, const scalar_t *w, const int R, const int k, const int texture_sample_type) { + scalar_t grad_texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = w[0] * R; + const int w_y = w[1] * R; + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + if (k == w_y * R + w_x) { + grad_texture_k = grad_color; + } + } else { + if (k == (R - 1 - w_y) * R + (R - 1 - w_x)) { + grad_texture_k = grad_color; + } + } + } else + if (texture_sample_type == 1) { + grad_texture_k = w[k] * grad_color; + } + return grad_texture_k; +} + + +template +__global__ void backward_soft_rasterize_cuda_kernel( + const scalar_t* __restrict__ faces, + const scalar_t* __restrict__ textures, + const scalar_t* __restrict__ soft_colors, + const scalar_t* __restrict__ points, + const scalar_t* __restrict__ faces_info, + const scalar_t* __restrict__ aggrs_info, // 0: sum, 1: max z*D + scalar_t* grad_faces, + scalar_t* grad_textures, + scalar_t* grad_soft_colors, + scalar_t* grad_points, + int batch_size, + int num_faces, + int image_size, + int texture_size, + int texture_res, + float near, + float far, + float eps, + float sigma_val, + int func_id_dist, + float dist_eps, + float gamma_val, + int func_id_rgb, + int func_id_alpha, + int texture_sample_type, + bool double_side) { + + //////////////////////// + //////////////////////// + + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * image_size * image_size) { + return; + } + const int is = image_size; + const int nf = num_faces; + const int bn = i / (is * is); + const int pn = i % (is * is); + const int yi = is - 1 - (pn / is); + const int xi = pn % is; + const scalar_t yp = (2. * yi + 1 - is) / is; + const scalar_t xp = (2. * xi + 1 - is) / is; + + const scalar_t* face = &faces[bn * nf * 9] - 9; + const scalar_t* texture = &textures[bn * nf * texture_size * 3] - texture_size * 3; + const scalar_t* face_info = &faces_info[bn * nf * 27] - 27; + + const scalar_t threshold = dist_eps * sigma_val; + + const scalar_t softmax_sum = aggrs_info[(bn * 2 + 0) * (is * is) + pn]; + const scalar_t softmax_max = aggrs_info[(bn * 2 + 1) * (is * is) + pn]; + + for (int fn = 0; fn < nf; fn++) { + face += 9; + texture += texture_size * 3; + face_info += 27; + + if (check_border(xp, yp, face, sqrt(threshold))) continue; + + scalar_t dis; + scalar_t dis_x; + scalar_t dis_y; + scalar_t t[3]; + scalar_t w[3]; + scalar_t w0[3]; + scalar_t sign; + scalar_t soft_fragment; + + barycentric_coordinate(w, xp, yp, face_info); + + // compute probability map based on distance functions + if (func_id_dist == 0) { // hard assign + soft_fragment = check_pixel_inside(w) ? 1. : 0.; + if (soft_fragment == 0.) continue; // ??? + } else + if (func_id_dist == 1) { // barycentric distance + forward_barycentric_p2f_distance(dis, w); + for (int k = 0; k < 3; k++) t[k] = w[k]; + if (-dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-dis / sigma_val)); + } else + if (func_id_dist == 2) { // euclidean distance + euclidean_p2f_distance(sign, dis_x, dis_y, w, t, face, face_info, xp, yp); + dis = dis_x * dis_x + dis_y * dis_y; + if (sign < 0 && dis >= threshold) continue; // ignore triangle too far away from the pixel + soft_fragment = 1. / (1. + exp(-sign * dis / sigma_val)); + } + + + scalar_t* grad_face = &grad_faces[(bn * nf + fn) * 9]; + scalar_t* grad_texture = &grad_textures[(bn * nf + fn) * texture_size * 3]; + scalar_t grad_v[3][3] = {0}; + scalar_t C_grad_xy = 0; + + ///////////////////////////////////////////////////// + + // aggragate for alpha channel + scalar_t C_grad_xy_alpha = grad_soft_colors[(bn * 4 + 3) * (is * is) + pn]; + if (func_id_alpha == 0) { // hard assign + // hard assign alpha channels does not have gradient + } else + if (func_id_alpha == 1) { // Sum + C_grad_xy_alpha /= nf; + } else + if (func_id_alpha == 2) { // Logical-Or + C_grad_xy_alpha *= (1 - soft_colors[(bn * 4 + 3) * (is * is) + pn]) / max(1 - soft_fragment, 1e-6); + } + C_grad_xy += C_grad_xy_alpha; + + ///////////////////////////////////////////////////// + for (int k = 0; k < 3; k++) w0[k] = w[k]; + barycentric_clip(w); + const scalar_t zp = 1. / (w[0] / face[2] + w[1] / face[5] + w[2] / face[8]); + if (zp < near || zp > far) continue; // triangle out of screen, pass + + // aggregate for rgb channels + if (func_id_rgb == 0) { // Hard assign, no gradient to xyz + if (fn == softmax_max) { + for (int k = 0; k < 3; k++) { + for (int j = 0; j < texture_size; j++) { + atomicAdd(&grad_texture[3 * j + k], backward_sample_texture(grad_soft_colors[(bn * 4 + k) * (is * is) + pn], w, texture_res, j, texture_sample_type)); + } + } + } + } else + if (func_id_rgb == 1 && (check_face_frontside(face) || double_side)) { // Softmax (Z * D) + scalar_t C_grad_xyz_rgb = 0.; + + const scalar_t zp_norm = (far - zp) / (far - near); + const scalar_t zp_softmax = soft_fragment * exp((zp_norm - softmax_max) / gamma_val) / softmax_sum; + + for (int k = 0; k < 3; k++) { + const scalar_t grad_soft_color_k = grad_soft_colors[(bn * 4 + k) * (is * is) + pn]; + + for (int j = 0; j < texture_size; j++) { + const scalar_t grad_t = backward_sample_texture(grad_soft_color_k, w, texture_res, j, texture_sample_type); + atomicAdd(&grad_texture[3 * j + k], zp_softmax * grad_t); + } + + const scalar_t color_k = forward_sample_texture(texture, w, texture_res, k, texture_sample_type); + C_grad_xyz_rgb += grad_soft_color_k * (color_k - soft_colors[(bn * 4 + k) * (is * is) + pn]); + } + C_grad_xyz_rgb *= zp_softmax; + C_grad_xy += C_grad_xyz_rgb / soft_fragment; + + const scalar_t C_grad_z_rgb = C_grad_xyz_rgb / gamma_val / (near - far) * zp * zp; + grad_v[0][2] = C_grad_z_rgb * w[0] / face[2] / face[2]; + grad_v[1][2] = C_grad_z_rgb * w[1] / face[5] / face[5]; + grad_v[2][2] = C_grad_z_rgb * w[2] / face[8] / face[8]; + } + + ///////////////////////////////////////////////////// + + C_grad_xy *= soft_fragment * (1 - soft_fragment) / sigma_val; // sigmoid gradient + // compute probability map gradient based on distance functions + if (func_id_dist == 1) { // barycentric distance + backward_barycentric_p2f_distance(grad_v, t, face_info, xp, yp, dis, C_grad_xy); + } else + if (func_id_dist == 2) { // euclidean distance + for (int k = 0; k < 3; k++) { + for (int l = 0; l < 2; l++) { + grad_v[k][l] = 2 * sign * C_grad_xy * (t[k] + w0[k]) * (l == 0 ? dis_x : dis_y); + } + } + } + + const scalar_t grad_px = grad_points[(bn * 2 + 0) * (is * is) + pn]; + const scalar_t grad_py = grad_points[(bn * 2 + 1) * (is * is) + pn]; + + grad_v[0][0] += grad_px*w[0] / face[2] / face[2]; + grad_v[0][1] += grad_py*w[0] / face[2] / face[2]; + grad_v[1][0] += grad_px*w[1] / face[5] / face[5]; + grad_v[1][1] += grad_py*w[1] / face[5] / face[5]; + grad_v[2][0] += grad_px*w[2] / face[8] / face[8]; + grad_v[2][1] += grad_py*w[2] / face[8] / face[8]; + + atomicAdd(&grad_face[0], grad_v[0][0]); + atomicAdd(&grad_face[1], grad_v[0][1]); + atomicAdd(&grad_face[3], grad_v[1][0]); + atomicAdd(&grad_face[4], grad_v[1][1]); + atomicAdd(&grad_face[6], grad_v[2][0]); + atomicAdd(&grad_face[7], grad_v[2][1]); + + atomicAdd(&grad_face[2], grad_v[0][2]); + atomicAdd(&grad_face[5], grad_v[1][2]); + atomicAdd(&grad_face[8], grad_v[2][2]); + } +} +} + ''', + cuda_src=f''' + @alias(faces, in0) + @alias(textures, in1) + @alias(soft_colors, in2) + @alias(points, in3) + @alias(faces_info, in4) + @alias(aggrs_info, in5) + @alias(grad_soft_colors, in6) + @alias(grad_points, in7) + @alias(grad_faces, out0) + @alias(grad_textures, out1) + + cudaMemsetAsync(out0_p, 0, out0->size); + cudaMemsetAsync(out1_p, 0, out1->size); + + const auto batch_size = faces_shape0; + const auto num_faces = faces_shape1; + const auto texture_size = textures_shape2; + const auto texture_res = int(sqrt(texture_size)); + const int threads = 512; + const dim3 blocks ((batch_size * {image_size} * {image_size} - 1) / threads + 1); + + backward_soft_rasterize_cuda_kernel<<>>( + faces_p, + textures_p, + soft_colors_p, + points_p, + faces_info_p, + aggrs_info_p, + grad_faces_p, + grad_textures_p, + grad_soft_colors_p, + grad_points_p, + batch_size, + num_faces, + {image_size}, + texture_size, + texture_res, + {near}, + {far}, + {eps}, + {sigma_val}, + {func_id_dist}, + {dist_eps}, + {gamma_val}, + {func_id_rgb}, + {func_id_alpha}, + {texture_sample_type}, + {double_side}); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in backward_soft_rasterize: %s", cudaGetErrorString(err)); + ''') \ No newline at end of file diff --git a/jrender/renderer/dr/dr_l/rasterizer.py b/jrender/renderer/dr/dr_l/rasterizer.py new file mode 100755 index 0000000..f8456f1 --- /dev/null +++ b/jrender/renderer/dr/dr_l/rasterizer.py @@ -0,0 +1,57 @@ + +import numpy as np +import jittor as jt +from jittor import nn + +from .DrL_rasterize import * + +class DrL_Rasterizer(nn.Module): + def __init__(self, image_size=256, background_color=[0, 0, 0], near=1, far=100, + anti_aliasing=False, fill_back=False, eps=1e-3, + sigma_val=1e-5, dist_func='euclidean', dist_eps=1e-4, + gamma_val=1e-4, aggr_func_rgb='softmax', aggr_func_alpha='prod', + texture_type='surface', + bin_size = 0, max_elems_per_bin = 0, max_faces_per_pixel_for_grad=16): + super(DrL_Rasterizer, self).__init__() + + if dist_func not in ['hard', 'euclidean', 'barycentric']: + raise ValueError('Distance function only support hard, euclidean and barycentric') + if aggr_func_rgb not in ['hard', 'softmax']: + raise ValueError('Aggregate function(rgb) only support hard and softmax') + if aggr_func_alpha not in ['hard', 'prod', 'sum']: + raise ValueError('Aggregate function(a) only support hard, prod and sum') + if texture_type not in ['surface', 'vertex']: + raise ValueError('Texture type only support surface and vertex') + + self.image_size = image_size + self.background_color = background_color + self.near = near + self.far = far + self.anti_aliasing = anti_aliasing + self.eps = eps + self.fill_back = fill_back + self.sigma_val = sigma_val + self.dist_func = dist_func + self.dist_eps = dist_eps + self.gamma_val = gamma_val + self.aggr_func_rgb = aggr_func_rgb + self.aggr_func_alpha = aggr_func_alpha + self.texture_type = texture_type + + self.bin_size = bin_size + self.max_elems_per_bin = max_elems_per_bin + self.max_faces_per_pixel_for_grad = max_faces_per_pixel_for_grad + + def execute(self, mesh, mode=None): + image_size = self.image_size * (2 if self.anti_aliasing else 1) + images, points, msks = DrL_rasterize(mesh.face_vertices, mesh.face_textures, image_size, + self.background_color, self.near, self.far, + self.fill_back, self.eps, + self.sigma_val, self.dist_func, self.dist_eps, + self.gamma_val, self.aggr_func_rgb, self.aggr_func_alpha, + self.texture_type, self.bin_size, self.max_elems_per_bin, + self.max_faces_per_pixel_for_grad) + + if self.anti_aliasing: + images = nn.pool(images, 2, "mean", stride=2) + return images,points,msks \ No newline at end of file diff --git a/jrender/renderer/dr/n3mr/__init__.py b/jrender/renderer/dr/n3mr/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/n3mr/cuda/rasterize.py b/jrender/renderer/dr/n3mr/cuda/rasterize.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/n3mr/n3mr.py b/jrender/renderer/dr/n3mr/n3mr.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/n3mr/rasterizer.py b/jrender/renderer/dr/n3mr/rasterizer.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/softras/__init__.py b/jrender/renderer/dr/softras/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/softras/cuda/__init__.py b/jrender/renderer/dr/softras/cuda/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/softras/cuda/soft_rasterize.py b/jrender/renderer/dr/softras/cuda/soft_rasterize.py old mode 100644 new mode 100755 index c83bd05..228ed25 --- a/jrender/renderer/dr/softras/cuda/soft_rasterize.py +++ b/jrender/renderer/dr/softras/cuda/soft_rasterize.py @@ -1,3 +1,978 @@ +<<<<<<< HEAD +import jittor as jt + +def forward_soft_rasterize(face_vertices, textures, + faces_info, aggrs_info, + soft_colors, faces_id_buffer, + image_size, near, far, eps, + sigma_val, func_id_dist, dist_eps, + gamma_val, func_id_rgb, func_id_alpha, + texture_sample_type, double_side): + return jt.code([faces_info.shape, aggrs_info.shape, soft_colors.shape, faces_id_buffer.shape], [faces_info.dtype, aggrs_info.dtype, soft_colors.dtype, faces_id_buffer.dtype], + [face_vertices, textures], + cuda_header=''' + #include + #include + +#define kMaxPointsPerPixel 64 + +namespace{ + + template + __device__ __forceinline__ void barycentric_coordinate(scalar_t *w, const scalar_t x, const scalar_t y, const scalar_t *face_info) { + w[0] = face_info[3 * 0 + 0] * x + face_info[3 * 0 + 1] * y + face_info[3 * 0 + 2]; + w[1] = face_info[3 * 1 + 0] * x + face_info[3 * 1 + 1] * y + face_info[3 * 1 + 2]; + w[2] = face_info[3 * 2 + 0] * x + face_info[3 * 2 + 1] * y + face_info[3 * 2 + 2]; + } + + + template + __device__ __forceinline__ bool check_border(const scalar_t x, const scalar_t y, const scalar_t *face, const scalar_t threshold) { + return (x > max(max(face[0], face[3]), face[6]) + threshold || + x < min(min(face[0], face[3]), face[6]) - threshold || + y > max(max(face[1], face[4]), face[7]) + threshold || + y < min(min(face[1], face[4]), face[7]) - threshold); + } + + + template + __device__ __forceinline__ bool check_face_frontside(const scalar_t *face) { + return (face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0]); + } + + + template + __device__ __forceinline__ bool check_pixel_inside(const scalar_t *w) { + return w[0] <= 1 && w[0] >= 0 && w[1] <= 1 && w[1] >= 0 && w[2] <= 1 && w[2] >= 0; + } + + + template + __device__ __forceinline__ void barycentric_clip(scalar_t *w) { + for (int k = 0; k < 3; k++) w[k] = max(min(w[k], 1.), 0.); + const scalar_t w_sum = max(w[0] + w[1] + w[2], 1e-5); + for (int k = 0; k < 3; k++) w[k] /= w_sum; + } + + + template + __device__ __forceinline__ void euclidean_p2f_distance(scalar_t &sign, scalar_t &dis_x, scalar_t &dis_y, + scalar_t *w, scalar_t *t, + const scalar_t* face, const scalar_t *face_info, + const scalar_t xp, const scalar_t yp) { + const scalar_t *face_sym = face_info + 9; + const scalar_t *face_obt = face_info + 18; + + if (w[0] > 0 && w[1] > 0 && w[2] > 0 && + w[0] < 1 && w[1] < 1 && w[2] < 1) { + // inside the triangle, w[0] + w[1] + w[2] = 0 + scalar_t dis_min = 100000000; + scalar_t dis_x_min = 0; + scalar_t dis_y_min = 0; + scalar_t a0[3]; + scalar_t t0[3]; + for (int k = 0; k < 3; k++) { + int v0 = k; + int v1 = (k + 1) % 3; + int v2 = (k + 2) % 3; + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t0[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t0[v1] = 1 - t0[v0]; + t0[v2] = 0; + + t0[0] -= w[0]; + t0[1] -= w[1]; + t0[2] -= w[2]; + + // calculate distance + dis_x = t0[0] * face[0] + t0[1] * face[3] + t0[2] * face[6]; + dis_y = t0[0] * face[1] + t0[1] * face[4] + t0[2] * face[7]; + scalar_t dis = dis_x * dis_x + dis_y * dis_y; + + if (dis < dis_min) { + dis_min = dis; + dis_x_min = dis_x; + dis_y_min = dis_y; + t[0] = t0[0]; + t[1] = t0[1]; + t[2] = t0[2]; + } + } + dis_x = dis_x_min; + dis_y = dis_y_min; + sign = 1; + } else { + int v0 = -1; + + if (w[1] <= 0 && w[2] <= 0) { + v0 = 0; + if (face_obt[0] == 1 && (xp - face[0]) * (face[6] - face[0]) + (yp - face[1]) * (face[7] - face[1]) > 0) v0 = 2; + } else if (w[2] <= 0 && w[0] <= 0) { + v0 = 1; + if (face_obt[1] == 1 && (xp - face[3]) * (face[0] - face[3]) + (yp - face[4]) * (face[1] - face[4]) > 0) v0 = 0; + } else if (w[0] <= 0 && w[1] <= 0) { + v0 = 2; + if (face_obt[2] == 1 && (xp - face[6]) * (face[3] - face[6]) + (yp - face[7]) * (face[4] - face[7]) > 0) v0 = 1; + } else + if (w[0] <= 0) v0 = 1; + else if (w[1] <= 0) v0 = 2; + else if (w[2] <= 0) v0 = 0; + + const int v1 = (v0 + 1) % 3; + const int v2 = (v0 + 2) % 3; + + scalar_t a0[3]; + + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t[v1] = 1 - t[v0]; + t[v2] = 0; + + // clamp to [0, 1] + for (int k = 0; k < 3; k++) { + t[k] = min(max(t[k], 0.), 1.); + t[k] -= w[k]; + } + + // calculate distance + dis_x = t[0] * face[0] + t[1] * face[3] + t[2] * face[6]; + dis_y = t[0] * face[1] + t[1] * face[4] + t[2] * face[7]; + sign = -1; + } + } + + + template + __device__ __forceinline__ void forward_barycentric_p2f_distance(scalar_t &dis, const scalar_t *w) { + dis = w[0] > w[1] ? (w[1] > w[2] ? w[2] : w[1]) : (w[0] > w[2] ? w[2] : w[0]); + dis = dis > 0 ? dis*dis : -dis*dis; + } + + template + __device__ __forceinline__ scalar_t forward_sample_texture(const scalar_t *texture, const scalar_t *w, const int R, const int k, const int texture_sample_type, const scalar_t* face, const scalar_t z) { + scalar_t texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + texture_k = texture[(w_y * R + w_x) * 3 + k]; + } else { + texture_k = texture[((R - 1 - w_y) * R + (R - 1 - w_x)) * 3 + k]; + } + } else + if (texture_sample_type == 1) { // sample vertex color + texture_k = w[0] * texture[k] / face[2] + w[1] * texture[3 + k] / face[5] + w[2] * texture[6 + k] / face[8]; + texture_k *= z; + } + return texture_k; + } + + // triangle preprocessing + template + __global__ void forward_soft_rasterize_inv_cuda_kernel( + const scalar_t* __restrict__ faces, + scalar_t* faces_info, + int batch_size, + int num_faces, + int image_size) { + /* batch number, face, number, image size, face[v012][RGB] */ + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * num_faces) { + return; + } + // const int is = image_size; + const scalar_t* face = &faces[i * 9]; + scalar_t* face_inv = &faces_info[i * 27]; + scalar_t* face_sym = &faces_info[i * 27+9]; + scalar_t* face_obt = &faces_info[i * 27+18]; + + /* return if backside */ + // if ((face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0])) + // return; + /* p[num][xy]: x, y is (-1, 1). */ + scalar_t p[3][2]; + for (int num = 0; num < 3; num++) { + for (int dim = 0; dim < 2; dim++) { + p[num][dim] = face[3 * num + dim]; // no normalize + } + } + /* compute face_inv */ + scalar_t face_inv_star[9] = { + p[1][1] - p[2][1], p[2][0] - p[1][0], p[1][0] * p[2][1] - p[2][0] * p[1][1], + p[2][1] - p[0][1], p[0][0] - p[2][0], p[2][0] * p[0][1] - p[0][0] * p[2][1], + p[0][1] - p[1][1], p[1][0] - p[0][0], p[0][0] * p[1][1] - p[1][0] * p[0][1]}; + scalar_t face_inv_determinant = ( + p[2][0] * (p[0][1] - p[1][1]) + + p[0][0] * (p[1][1] - p[2][1]) + + p[1][0] * (p[2][1] - p[0][1])); + face_inv_determinant = face_inv_determinant > 0 ? max(face_inv_determinant, 1e-10) : min(face_inv_determinant, -1e-10); + /* set to global memory */ + for (int k = 0; k < 9; k++) { + face_inv[k] = face_inv_star[k] / face_inv_determinant; + } + /* F * F.T */ + for (int j = 0; j < 3; j++) { + for (int k = 0; k < 3; k++) { + face_sym[j * 3 + k] = face[j * 3 + 0] * face[k * 3 + 0] + + face[j * 3 + 1] * face[k * 3 + 1] + + 1; + } + } + /* check if one arc is obt arc */ + for (int k = 0; k < 3; k++) { + const int k0 = k; + const int k1 = (k + 1) % 3; + const int k2 = (k + 2) % 3; + if ((p[k1][0] - p[k0][0]) * (p[k2][0] - p[k0][0]) + (p[k1][1] - p[k0][1]) * (p[k2][1] - p[k0][1]) < 0) { + face_obt[k0] = 1; + break; + } + } + } + + struct Pixel{ + int id; + float z; + }; + + template + __global__ void forward_soft_rasterize_cuda_kernel( + const scalar_t* __restrict__ faces, + const scalar_t* __restrict__ textures, + const scalar_t* __restrict__ faces_info, + scalar_t* aggrs_info, + scalar_t* soft_colors, + int* faces_id_buffers, + int batch_size, + int num_faces, + int image_size, + int max_faces_id, + int texture_size, + int texture_res, + float near, + float far, + float eps, + float sigma_val, + int func_id_dist, + float dist_eps, + float gamma_val, + int func_id_rgb, + int func_id_alpha, + int texture_sample_type, + int double_side) { + + //////////////////////// + //////////////////////// + + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * image_size * image_size) { + return; + } + const int is = image_size; + const int nf = num_faces; + const int bn = i / (is * is); + const int pn = i % (is * is); + const int yi = is - 1 - (pn / is); + const int xi = pn % is; + const scalar_t yp = (2. * yi + 1. - is) / is; + const scalar_t xp = (2. * xi + 1. - is) / is; + + const scalar_t *face = &faces[bn * nf * 9] - 9; + const scalar_t *texture = &textures[bn * nf * texture_size * 3] - texture_size * 3; + const scalar_t *face_info = &faces_info[bn * nf * 27] - 27; + + const scalar_t threshold = dist_eps * sigma_val; + + // Initialize pixel color + scalar_t soft_color[4] = {1., 1., 1., 0.}; + if (func_id_alpha == 2) soft_color[3] = 1.; + scalar_t softmax_sum = exp(eps / gamma_val); + scalar_t softmax_max = eps; + for (int k = 0; k < 3; k++) { + if (func_id_rgb == 0) { // hard assign, set to background + soft_color[k] = soft_colors[(bn * 4 + k) * (is * is) + pn]; + } else + if (func_id_rgb == 1) { + soft_color[k] = soft_colors[(bn * 4 + k) * (is * is) + pn] * softmax_sum; // initialize background color + } + } + scalar_t depth_min = 10000000; + int face_index_min = -1; + Pixel q[kMaxPointsPerPixel]; + int q_size = 0; + float q_max_z = -1; + int q_max_id = -1; + + for (int fn = 0; fn < nf; fn++) { + face += 9; + texture += texture_size * 3; + face_info += 27; + + if (check_border(xp, yp, face, sqrt(threshold))) continue; // triangle too far away from pixel + + scalar_t dis; + scalar_t dis_x; + scalar_t dis_y; + scalar_t t[3]; + scalar_t w[3]; + scalar_t w_clip[3]; + scalar_t sign; + scalar_t soft_fragment; + + // compute barycentric coordinate w + barycentric_coordinate(w, xp, yp, face_info); + + // compute probability map based on distance functions + if (func_id_dist == 0) { // hard assign + soft_fragment = check_pixel_inside(w) ? 1. : 0.; + if (soft_fragment == 0.) continue; // ignore triangle outside of the pixel + } else + if (func_id_dist == 1) { // barycentric distance + forward_barycentric_p2f_distance(dis, w); + if (-dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-dis / sigma_val)); + } else + if (func_id_dist == 2) { // euclidean distance + euclidean_p2f_distance(sign, dis_x, dis_y, w, t, face, face_info, xp, yp); + dis = dis_x * dis_x + dis_y * dis_y; + if (sign < 0 && dis >= threshold) continue; // ignore triangle far away from the pixel + soft_fragment = 1. / (1. + exp(-sign * dis / sigma_val)); + } + + ///////////////////////////////////////////////////// + + // aggragate for alpha channel + if (func_id_alpha == 0) { // hard assign + if (soft_fragment > 0.5) soft_color[3] = 1.; + } else + if (func_id_alpha == 1) { // Sum + soft_color[3] += soft_fragment; + } else + if (func_id_alpha == 2) { // Logical-Or + soft_color[3] *= 1. - soft_fragment; + } + + ///////////////////////////////////////////////////// + + for (int k = 0; k < 3; k++) w_clip[k] = w[k]; + barycentric_clip(w_clip); + const scalar_t zp = 1. / (w_clip[0] / face[2] + w_clip[1] / face[5] + w_clip[2] / face[8]); + if (zp < near || zp > far) continue; // triangle out of screen, pass + + /////////////////////////////////////////////////// + // choose Topk + if (q_size < max_faces_id){ + q[q_size] = {fn,zp}; + if (zp > q_max_z){ + q_max_z = zp; + q_max_id = q_size; + } + q_size++; + } else if (zp < q_max_z){ + q[q_max_id] = {fn,zp}; + q_max_z = -1; + for(int k = 0; k < q_size; k++){ + if(q[k].z > q_max_z){ + q_max_z = q[k].z; + q_max_id = k; + } + } + } + + + ///////////////////////////////////////////////////// + // aggregate for rgb channels + if (func_id_rgb == 0) { // Hard assign + if (zp < depth_min && check_pixel_inside(w) && (double_side || check_face_frontside(face))) { + depth_min = zp; + face_index_min = fn; + for (int k = 0; k < 3; k++) { + soft_color[k] = forward_sample_texture(texture, w_clip, texture_res, k, texture_sample_type, face, zp); + } + } + } else + if (func_id_rgb == 1) { // D * Softmax (Z) + if (check_face_frontside(face) || double_side) { + const scalar_t zp_norm = (far - zp) / (far - near); + scalar_t exp_delta_zp = 1.; + if (zp_norm > softmax_max) { + exp_delta_zp = exp((softmax_max - zp_norm) / gamma_val); + softmax_max = zp_norm; + } + const scalar_t exp_z = exp((zp_norm - softmax_max) / gamma_val); + softmax_sum = exp_delta_zp * softmax_sum + exp_z * soft_fragment; + for (int k = 0; k < 3; k++) { + const scalar_t color_k = forward_sample_texture(texture, w_clip, texture_res, k, texture_sample_type, face, zp); + soft_color[k] = exp_delta_zp * soft_color[k] + exp_z * soft_fragment * color_k;// * soft_fragment; + if(isnan(color_k)){ + //printf("color_k: %f exp_z: %f soft_color: %f\\n",color_k,exp_z,soft_color[k]); + //printf("%f %f %f\\n",w_clip[0],w_clip[1],w_clip[2]); + //printf("zp: %f\\n",zp); + } + } + } + } + + } + + ////////////////////////////////////////////// + + // finalize aggregation + if (func_id_alpha == 0) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = soft_color[3]; + } else + if (func_id_alpha == 1) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = soft_color[3] / nf; + } else + if (func_id_alpha == 2) { + soft_colors[(bn * 4 + 3) * (is * is) + pn] = 1. - soft_color[3]; + } + + if (func_id_rgb == 0) { + if (face_index_min != -1) + for (int k = 0; k < 3; k++) { + soft_colors[(bn * 4 + k) * (is * is) + pn] = soft_color[k]; + } + aggrs_info[(bn * 2 + 0) * (is * is) + pn] = depth_min; + aggrs_info[(bn * 2 + 1) * (is * is) + pn] = face_index_min; + } else + if (func_id_rgb == 1) { + for (int k = 0; k < 3; k++) { + soft_colors[(bn * 4 + k) * (is * is) + pn] = soft_color[k] / softmax_sum; + if(isnan(soft_color[k])) + printf("i: %d xi: %d yi: %d soft_color: %f\\n",i,xi,yi,soft_color[k]); + } + aggrs_info[(bn * 2 + 0) * (is * is) + pn] = softmax_sum; + aggrs_info[(bn * 2 + 1) * (is * is) + pn] = softmax_max; + } + for (int k = 0; k < q_size; k++) { + faces_id_buffers[(bn * max_faces_id + k) * (is * is) + pn] = q[k].id; + } + } +} + ''', + cuda_src=f''' + @alias(faces, in0) + @alias(textures, in1) + @alias(faces_info, out0) + @alias(aggrs_info, out1) + @alias(soft_colors, out2) + @alias(faces_id_buffer, out3) + + cudaMemsetAsync(out0_p, 0, out0->size); + cudaMemsetAsync(out1_p, 0, out1->size); + cudaMemsetAsync(out2_p, 0, out2->size); + cudaMemsetAsync(out3_p, -1, out3->size); + + const auto batch_size = faces_shape0; + const auto num_faces = faces_shape1; + const auto texture_size = textures_shape2; + const auto texture_res = int(sqrt(texture_size)); + const auto max_faces_id = faces_id_buffer_shape1; + const int threads = 512; + const dim3 blocks_1 ((batch_size * num_faces - 1) / threads +1); + + forward_soft_rasterize_inv_cuda_kernel<<>>( + faces_p, + faces_info_p, + batch_size, + num_faces, + {image_size}); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in forward_transform_inv_triangle: %s\\n", cudaGetErrorString(err)); + + const dim3 blocks_2 ((batch_size * {image_size} * {image_size} - 1) / threads +1); + + forward_soft_rasterize_cuda_kernel<<>>( + faces_p, + textures_p, + faces_info_p, + aggrs_info_p, + soft_colors_p, + faces_id_buffer_p, + batch_size, + num_faces, + {image_size}, + max_faces_id, + texture_size, + texture_res, + {near}, + {far}, + {eps}, + {sigma_val}, + {func_id_dist}, + {dist_eps}, + {gamma_val}, + {func_id_rgb}, + {func_id_alpha}, + {texture_sample_type}, + {double_side}); + + err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in forward_soft_rasterize: %s\\n", cudaGetErrorString(err)); + ''') + +def backward_soft_rasterize(faces, textures, soft_colors, + faces_info, aggrs_info, faces_id_buffer, + grad_faces, grad_textures, grad_soft_colors, + image_size, near, far, eps, + sigma_val, func_id_dist, dist_eps, + gamma_val, func_id_rgb, func_id_alpha, + texture_sample_type, double_side): + return jt.code([grad_faces.shape, grad_textures.shape], [grad_faces.dtype, grad_textures.dtype], [faces, textures, soft_colors, + faces_info, aggrs_info, grad_soft_colors, faces_id_buffer], + cuda_header=''' +#include +#include + +namespace{ + +template +__device__ __forceinline__ void barycentric_coordinate(scalar_t *w, const scalar_t x, const scalar_t y, const scalar_t *face_info) { + w[0] = face_info[3 * 0 + 0] * x + face_info[3 * 0 + 1] * y + face_info[3 * 0 + 2]; + w[1] = face_info[3 * 1 + 0] * x + face_info[3 * 1 + 1] * y + face_info[3 * 1 + 2]; + w[2] = face_info[3 * 2 + 0] * x + face_info[3 * 2 + 1] * y + face_info[3 * 2 + 2]; +} + + +template +__device__ __forceinline__ bool check_border(const scalar_t x, const scalar_t y, const scalar_t *face, const scalar_t threshold) { + return (x > max(max(face[0], face[3]), face[6]) + threshold || + x < min(min(face[0], face[3]), face[6]) - threshold || + y > max(max(face[1], face[4]), face[7]) + threshold || + y < min(min(face[1], face[4]), face[7]) - threshold); +} + + +template +__device__ __forceinline__ bool check_face_frontside(const scalar_t *face) { + return (face[7] - face[1]) * (face[3] - face[0]) < (face[4] - face[1]) * (face[6] - face[0]); +} + + +template +__device__ __forceinline__ bool check_pixel_inside(const scalar_t *w) { + return w[0] <= 1 && w[0] >= 0 && w[1] <= 1 && w[1] >= 0 && w[2] <= 1 && w[2] >= 0; +} + + +template +__device__ __forceinline__ void barycentric_clip(scalar_t *w) { + for (int k = 0; k < 3; k++) w[k] = max(min(w[k], 1.), 0.); + const scalar_t w_sum = max(w[0] + w[1] + w[2], 1e-5); + for (int k = 0; k < 3; k++) w[k] /= w_sum; +} + + +template +__device__ __forceinline__ void euclidean_p2f_distance(scalar_t &sign, scalar_t &dis_x, scalar_t &dis_y, + scalar_t *w, scalar_t *t, + const scalar_t* face, const scalar_t *face_info, + const scalar_t xp, const scalar_t yp) { + const scalar_t *face_sym = face_info + 9; + const scalar_t *face_obt = face_info + 18; + + if (w[0] > 0 && w[1] > 0 && w[2] > 0 && + w[0] < 1 && w[1] < 1 && w[2] < 1) { + // inside the triangle, w[0] + w[1] + w[2] = 0 + scalar_t dis_min = 100000000; + scalar_t dis_x_min = 0; + scalar_t dis_y_min = 0; + scalar_t a0[3]; + scalar_t t0[3]; + for (int k = 0; k < 3; k++) { + int v0 = k; + int v1 = (k + 1) % 3; + int v2 = (k + 2) % 3; + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t0[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t0[v1] = 1 - t0[v0]; + t0[v2] = 0; + + t0[0] -= w[0]; + t0[1] -= w[1]; + t0[2] -= w[2]; + + // calculate distance + dis_x = t0[0] * face[0] + t0[1] * face[3] + t0[2] * face[6]; + dis_y = t0[0] * face[1] + t0[1] * face[4] + t0[2] * face[7]; + scalar_t dis = dis_x * dis_x + dis_y * dis_y; + + if (dis < dis_min) { + dis_min = dis; + dis_x_min = dis_x; + dis_y_min = dis_y; + t[0] = t0[0]; + t[1] = t0[1]; + t[2] = t0[2]; + } + } + dis_x = dis_x_min; + dis_y = dis_y_min; + sign = 1; + } else { + int v0 = -1; + + if (w[1] <= 0 && w[2] <= 0) { + v0 = 0; + if (face_obt[0] == 1 && (xp - face[0]) * (face[6] - face[0]) + (yp - face[1]) * (face[7] - face[1]) > 0) v0 = 2; + } else if (w[2] <= 0 && w[0] <= 0) { + v0 = 1; + if (face_obt[1] == 1 && (xp - face[3]) * (face[0] - face[3]) + (yp - face[4]) * (face[1] - face[4]) > 0) v0 = 0; + } else if (w[0] <= 0 && w[1] <= 0) { + v0 = 2; + if (face_obt[2] == 1 && (xp - face[6]) * (face[3] - face[6]) + (yp - face[7]) * (face[4] - face[7]) > 0) v0 = 1; + } else + if (w[0] <= 0) v0 = 1; + else if (w[1] <= 0) v0 = 2; + else if (w[2] <= 0) v0 = 0; + + const int v1 = (v0 + 1) % 3; + const int v2 = (v0 + 2) % 3; + + scalar_t a0[3]; + + a0[0] = face_sym[3 * v0 + 0] - face_sym[3 * v1 + 0]; + a0[1] = face_sym[3 * v0 + 1] - face_sym[3 * v1 + 1]; + a0[2] = face_sym[3 * v0 + 2] - face_sym[3 * v1 + 2]; + + t[v0] = (w[0] * a0[0] + w[1] * a0[1] + w[2] * a0[2] - a0[v1]) / (a0[v0] - a0[v1]); + t[v1] = 1 - t[v0]; + t[v2] = 0; + + // clamp to [0, 1] + for (int k = 0; k < 3; k++) { + t[k] = min(max(t[k], 0.), 1.); + t[k] -= w[k]; + } + + // calculate distance + dis_x = t[0] * face[0] + t[1] * face[3] + t[2] * face[6]; + dis_y = t[0] * face[1] + t[1] * face[4] + t[2] * face[7]; + sign = -1; + } +} + + +template +__device__ __forceinline__ void forward_barycentric_p2f_distance(scalar_t &dis, const scalar_t *w) { + dis = w[0] > w[1] ? (w[1] > w[2] ? w[2] : w[1]) : (w[0] > w[2] ? w[2] : w[0]); + dis = dis > 0 ? dis*dis : -dis*dis; +} + + +template +__device__ __forceinline__ void backward_barycentric_p2f_distance(scalar_t grad_v[3][3], const scalar_t *w, const scalar_t *face_info, const scalar_t xp, const scalar_t yp, const scalar_t dis, const scalar_t C) { + const int p = w[0] > w[1] ? (w[1] > w[2] ? 2 : 1) : (w[0] > w[2] ? 2 : 0); + const scalar_t *face_inv = face_info; + for (int l = 0; l < 2; l++) { + for (int k = 0; k < 3; k++) { + scalar_t grad_kl = 0; + for (int q = 0; q < 3; q++) { + grad_kl += -face_inv[3*p+l] * face_inv[3*k+q] * (q == 0 ? xp : (q == 1 ? yp : 1)); + } + grad_v[k][l] = grad_kl * C; + grad_v[k][l] *= dis > 0 ? (2. * sqrt(dis)) : (2. * sqrt(-dis)); + } + } +} + + +template +__device__ __forceinline__ scalar_t forward_sample_texture(const scalar_t *texture, const scalar_t *w, const int R, const int k, const int texture_sample_type) { + scalar_t texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + texture_k = texture[(w_y * R + w_x) * 3 + k]; + } else { + texture_k = texture[((R - 1 - w_y) * R + (R - 1 - w_x)) * 3 + k]; + } + } else + if (texture_sample_type == 1) { // sample vertex color + texture_k = w[0] * texture[k] + w[1] * texture[3+k] + w[2] * texture[6+k]; + } + return texture_k; +} + + +template +__device__ __forceinline__ scalar_t backward_sample_texture(const scalar_t grad_color, const scalar_t *w, const int R, const int k, const int texture_sample_type) { + scalar_t grad_texture_k; + if (texture_sample_type == 0) { // sample surface color with resolution as R + const int w_x = min(w[0] * R, float(R-1)); + const int w_y = min(w[1] * R, float(R-1)); + if ((w[0] + w[1]) * R - w_x - w_y <= 1) { + if (k == w_y * R + w_x) { + grad_texture_k = grad_color; + } + } else { + if (k == (R - 1 - w_y) * R + (R - 1 - w_x)) { + grad_texture_k = grad_color; + } + } + } else + if (texture_sample_type == 1) { + grad_texture_k = w[k] * grad_color; + } + return grad_texture_k; +} + + +template +__global__ void backward_soft_rasterize_cuda_kernel( + const scalar_t* __restrict__ faces, + const int* __restrict__ faces_id_buffers, + const scalar_t* __restrict__ textures, + const scalar_t* __restrict__ soft_colors, + const scalar_t* __restrict__ faces_info, + const scalar_t* __restrict__ aggrs_info, // 0: sum, 1: max z*D + scalar_t* grad_faces, + scalar_t* grad_textures, + scalar_t* grad_soft_colors, + int batch_size, + int num_faces, + int image_size, + int max_faces_id, + int texture_size, + int texture_res, + float near, + float far, + float eps, + float sigma_val, + int func_id_dist, + float dist_eps, + float gamma_val, + int func_id_rgb, + int func_id_alpha, + int texture_sample_type, + bool double_side) { + + //////////////////////// + //////////////////////// + + const int i = blockIdx.x * blockDim.x + threadIdx.x; + if (i >= batch_size * image_size * image_size) { + return; + } + const int is = image_size; + const int nf = num_faces; + const int mf = max_faces_id; + const int bn = i / (is * is); + const int pn = i % (is * is); + const int yi = is - 1 - (pn / is); + const int xi = pn % is; + const scalar_t yp = (2. * yi + 1 - is) / is; + const scalar_t xp = (2. * xi + 1 - is) / is; + + const scalar_t* face; + const scalar_t* texture; + const scalar_t* face_info; + const int* faces_id_buffer = &faces_id_buffers[bn * is * is * mf + pn * mf]; + + const scalar_t threshold = dist_eps * sigma_val; + + const scalar_t softmax_sum = aggrs_info[(bn * 2 + 0) * (is * is) + pn]; + const scalar_t softmax_max = aggrs_info[(bn * 2 + 1) * (is * is) + pn]; + + for (int m = 0; m < mf; m++) { + int fn = faces_id_buffer[m]; + + if (fn == -1){ + break; + } + + face = &faces[(bn * nf + fn) * 9]; + texture = &textures[(bn * nf + fn) * texture_size * 3]; + face_info = &faces_info[(bn * nf + fn) * 27]; + + if (check_border(xp, yp, face, sqrt(threshold))) continue; + + scalar_t dis; + scalar_t dis_x; + scalar_t dis_y; + scalar_t t[3]; + scalar_t w[3]; + scalar_t w0[3]; + scalar_t sign; + scalar_t soft_fragment; + + barycentric_coordinate(w, xp, yp, face_info); + + // compute probability map based on distance functions + if (func_id_dist == 0) { // hard assign + soft_fragment = 1; + } else + if (func_id_dist == 1) { // barycentric distance + forward_barycentric_p2f_distance(dis, w); + for (int k = 0; k < 3; k++) t[k] = w[k]; + soft_fragment = 1. / (1. + exp(-dis / sigma_val)); + } else + if (func_id_dist == 2) { // euclidean distance + euclidean_p2f_distance(sign, dis_x, dis_y, w, t, face, face_info, xp, yp); + dis = dis_x * dis_x + dis_y * dis_y; + soft_fragment = 1. / (1. + exp(-sign * dis / sigma_val)); + } + + + scalar_t* grad_face = &grad_faces[(bn * nf + fn) * 9]; + scalar_t* grad_texture = &grad_textures[(bn * nf + fn) * texture_size * 3]; + scalar_t grad_v[3][3] = {0}; + scalar_t C_grad_xy = 0; + + ///////////////////////////////////////////////////// + + // aggragate for alpha channel + scalar_t C_grad_xy_alpha = grad_soft_colors[(bn * 4 + 3) * (is * is) + pn]; + if (func_id_alpha == 0) { // hard assign + // hard assign alpha channels does not have gradient + } else + if (func_id_alpha == 1) { // Sum + C_grad_xy_alpha /= nf; + } else + if (func_id_alpha == 2) { // Logical-Or + C_grad_xy_alpha *= (1 - soft_colors[(bn * 4 + 3) * (is * is) + pn]) / max(1 - soft_fragment, 1e-6); + } + C_grad_xy += C_grad_xy_alpha; + + ///////////////////////////////////////////////////// + for (int k = 0; k < 3; k++) w0[k] = w[k]; + barycentric_clip(w); + const scalar_t zp = 1. / (w[0] / face[2] + w[1] / face[5] + w[2] / face[8]); + + // aggregate for rgb channels + if (func_id_rgb == 0) { // Hard assign, no gradient to xyz + if (fn == softmax_max){ + for (int k = 0; k < 3; k++) { + for (int j = 0; j < texture_size; j++) { + atomicAdd(&grad_texture[3 * j + k], backward_sample_texture(grad_soft_colors[(bn * 4 + k) * (is * is) + pn], w, texture_res, j, texture_sample_type)); + } + } + } + } else + if (func_id_rgb == 1) { // Softmax (Z * D) + scalar_t C_grad_xyz_rgb = 0.; + + const scalar_t zp_norm = (far - zp) / (far - near); + const scalar_t zp_softmax = soft_fragment * exp((zp_norm - softmax_max) / gamma_val) / softmax_sum; + + for (int k = 0; k < 3; k++) { + const scalar_t grad_soft_color_k = grad_soft_colors[(bn * 4 + k) * (is * is) + pn]; + + for (int j = 0; j < texture_size; j++) { + const scalar_t grad_t = backward_sample_texture(grad_soft_color_k, w, texture_res, j, texture_sample_type); + atomicAdd(&grad_texture[3 * j + k], zp_softmax * grad_t); + } + + const scalar_t color_k = forward_sample_texture(texture, w, texture_res, k, texture_sample_type); + C_grad_xyz_rgb += grad_soft_color_k * (color_k - soft_colors[(bn * 4 + k) * (is * is) + pn]); + } + C_grad_xyz_rgb *= zp_softmax; + C_grad_xy += C_grad_xyz_rgb / soft_fragment; + + const scalar_t C_grad_z_rgb = C_grad_xyz_rgb / gamma_val / (near - far) * zp * zp; + grad_v[0][2] = C_grad_z_rgb * w[0] / face[2] / face[2]; + grad_v[1][2] = C_grad_z_rgb * w[1] / face[5] / face[5]; + grad_v[2][2] = C_grad_z_rgb * w[2] / face[8] / face[8]; + } + + ///////////////////////////////////////////////////// + + C_grad_xy *= soft_fragment * (1 - soft_fragment) / sigma_val; // sigmoid gradient + // compute probability map gradient based on distance functions + if (func_id_dist == 1) { // barycentric distance + backward_barycentric_p2f_distance(grad_v, t, face_info, xp, yp, dis, C_grad_xy); + } else + if (func_id_dist == 2) { // euclidean distance + for (int k = 0; k < 3; k++) { + for (int l = 0; l < 2; l++) { + grad_v[k][l] = 2 * sign * C_grad_xy * (t[k] + w0[k]) * (l == 0 ? dis_x : dis_y); + } + } + } + + atomicAdd(&grad_face[0], grad_v[0][0]); + atomicAdd(&grad_face[1], grad_v[0][1]); + atomicAdd(&grad_face[3], grad_v[1][0]); + atomicAdd(&grad_face[4], grad_v[1][1]); + atomicAdd(&grad_face[6], grad_v[2][0]); + atomicAdd(&grad_face[7], grad_v[2][1]); + + atomicAdd(&grad_face[2], grad_v[0][2]); + atomicAdd(&grad_face[5], grad_v[1][2]); + atomicAdd(&grad_face[8], grad_v[2][2]); + } +} +} + ''', + cuda_src=f''' + @alias(faces, in0) + @alias(textures, in1) + @alias(soft_colors, in2) + @alias(faces_info, in3) + @alias(aggrs_info, in4) + @alias(grad_soft_colors, in5) + @alias(faces_id_buffer,in6) + @alias(grad_faces, out0) + @alias(grad_textures, out1) + + cudaMemsetAsync(out0_p, 0, out0->size); + cudaMemsetAsync(out1_p, 0, out1->size); + + const auto batch_size = faces_shape0; + const auto num_faces = faces_shape1; + const auto texture_size = textures_shape2; + const auto texture_res = int(sqrt(texture_size)); + const auto max_faces_id = faces_id_buffer_shape3; + const int threads = 512; + const dim3 blocks ((batch_size * {image_size} * {image_size} - 1) / threads + 1); + + backward_soft_rasterize_cuda_kernel<<>>( + faces_p, + faces_id_buffer_p, + textures_p, + soft_colors_p, + faces_info_p, + aggrs_info_p, + grad_faces_p, + grad_textures_p, + grad_soft_colors_p, + batch_size, + num_faces, + {image_size}, + max_faces_id, + texture_size, + texture_res, + {near}, + {far}, + {eps}, + {sigma_val}, + {func_id_dist}, + {dist_eps}, + {gamma_val}, + {func_id_rgb}, + {func_id_alpha}, + {texture_sample_type}, + {double_side}); + + cudaError_t err = cudaGetLastError(); + if (err != cudaSuccess) + printf("Error in backward_soft_rasterize: %s", cudaGetErrorString(err)); + ''') +======= import jittor as jt def forward_soft_rasterize(face_vertices, textures, @@ -1414,3 +2389,4 @@ def backward_soft_rasterize(faces, textures, soft_colors, if (err != cudaSuccess) printf("Error in backward_soft_rasterize: %s", cudaGetErrorString(err)); ''') +>>>>>>> main diff --git a/jrender/renderer/dr/softras/cuda/soft_rasterize_coarse_to_fine.py b/jrender/renderer/dr/softras/cuda/soft_rasterize_coarse_to_fine.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/softras/rasterizer.py b/jrender/renderer/dr/softras/rasterizer.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/dr/softras/soft_rasterize.py b/jrender/renderer/dr/softras/soft_rasterize.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/lighting/__init__.py b/jrender/renderer/lighting/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/lighting/ambient_lighting.py b/jrender/renderer/lighting/ambient_lighting.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/lighting/directional_lighting.py b/jrender/renderer/lighting/directional_lighting.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/lighting/lighting.py b/jrender/renderer/lighting/lighting.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/renderer.py b/jrender/renderer/renderer.py old mode 100644 new mode 100755 index 72cab8f..2bfd854 --- a/jrender/renderer/renderer.py +++ b/jrender/renderer/renderer.py @@ -1,71 +1,78 @@ -import jittor as jt -from jittor import nn - -from .lighting import * -from .transform import * -from .dr import * -from ..structures import * -import jrender as jr - -class Renderer(nn.Module): - def __init__(self, image_size=256, background_color=[0,0,0], near=1, far=100, - anti_aliasing=False, fill_back=True, eps=1e-3, - sigma_val=1e-5, dist_func='euclidean', dist_eps=1e-4, - gamma_val=1e-4, aggr_func_rgb='softmax', aggr_func_alpha='prod', - texture_type='surface', - camera_mode='look_at', - K=None, R=None, t=None, dist_coeffs=None, orig_size=512, - perspective=True, viewing_angle=30, viewing_scale=1.0, - eye=None, camera_direction=[0,0,1], - light_mode='surface', - light_intensity_ambient=0.5, light_color_ambient=[1,1,1], - light_intensity_directionals=0.5, light_color_directionals=[1,1,1], - light_directions=[0,1,0], dr_type='softras', Gbuffer='None', bin_size=0, max_elems_per_bin=0, max_faces_per_pixel_for_grad=16): - super(Renderer, self).__init__() - # camera - self.transform = Transform(camera_mode, - K, R, t, dist_coeffs, orig_size, - perspective, viewing_angle, viewing_scale, - eye, camera_direction) - - # light - self.lighting = Lighting(light_mode, - light_intensity_ambient, light_color_ambient, - light_intensity_directionals, light_color_directionals, - light_directions, Gbuffer, self.transform) - # rasterization - self.dr_type = dr_type - if dr_type == 'softras': - self.rasterizer = SoftRasterizer(image_size, background_color, near, far, - anti_aliasing, fill_back, eps, - sigma_val, dist_func, dist_eps, - gamma_val, aggr_func_rgb, aggr_func_alpha, - texture_type, bin_size, max_elems_per_bin, - max_faces_per_pixel_for_grad) - elif dr_type == 'n3mr': - self.rasterizer = N3mrRasterizer(image_size, anti_aliasing, background_color, fill_back) - else: - raise ValueError("dr_type should be one of None, 'softras' or 'n3mr'") - - def set_sigma(self, sigma): - self.rasterizer.sigma_val = sigma - - def set_gamma(self, gamma): - self.rasterizer.gamma_val = gamma - - def set_texture_mode(self, mode): - assert mode in ['vertex', 'surface'], 'Mode only support surface and vertex' - - self.lighting.light_mode = mode - self.rasterizer.texture_type = mode - - def render_mesh(self, mesh, mode='rgb'): - self.set_texture_mode(mesh.texture_type) - mesh = self.lighting(mesh, self.transform.eyes) - mesh = self.transform(mesh) - return self.rasterizer(mesh, mode) - - - def execute(self, vertices, faces, textures=None,mode='rgb', texture_type='surface', metallic_textures=None, roughness_textures=None): - mesh = jr.Mesh(vertices, faces, textures=textures, texture_type=texture_type, metallic_textures=metallic_textures, roughness_textures=roughness_textures) - return self.render_mesh(mesh, mode) +import jittor as jt +from jittor import nn + +from .lighting import * +from .transform import * +from .dr import * +from ..structures import * +import jrender as jr + +class Renderer(nn.Module): + def __init__(self, image_size=256, background_color=[0,0,0], near=1, far=100, + anti_aliasing=False, fill_back=True, eps=1e-3, + sigma_val=1e-5, dist_func='euclidean', dist_eps=1e-4, + gamma_val=1e-4, aggr_func_rgb='softmax', aggr_func_alpha='prod', + texture_type='surface', + camera_mode='look_at', + K=None, R=None, t=None, dist_coeffs=None, orig_size=512, + perspective=True, viewing_angle=30, viewing_scale=1.0, coordinate = "right", + eye=None, camera_direction=[0,0,1], + light_mode='surface', + light_intensity_ambient=0.5, light_color_ambient=[1,1,1], + light_intensity_directionals=0.5, light_color_directionals=[1,1,1], + light_directions=[0,1,0], dr_type='softras', Gbuffer='None', bin_size=0, max_elems_per_bin=0, max_faces_per_pixel_for_grad=16): + super(Renderer, self).__init__() + # camera + self.transform = Transform(camera_mode, + K, R, t, dist_coeffs, orig_size, + perspective, viewing_angle, viewing_scale, + eye, camera_direction, coordinate=coordinate) + + # light + self.lighting = Lighting(light_mode, + light_intensity_ambient, light_color_ambient, + light_intensity_directionals, light_color_directionals, + light_directions, Gbuffer, self.transform) + # rasterization + self.dr_type = dr_type + if dr_type == 'softras': + self.rasterizer = SoftRasterizer(image_size, background_color, near, far, + anti_aliasing, fill_back, eps, + sigma_val, dist_func, dist_eps, + gamma_val, aggr_func_rgb, aggr_func_alpha, + texture_type, bin_size, max_elems_per_bin, + max_faces_per_pixel_for_grad) + elif dr_type == 'n3mr': + self.rasterizer = N3mrRasterizer(image_size, anti_aliasing, background_color, fill_back) + elif dr_type == 'DrL': + self.rasterizer = DrL_Rasterizer(image_size, background_color, near, far, + anti_aliasing, fill_back, eps, + sigma_val, dist_func, dist_eps, + gamma_val, aggr_func_rgb, aggr_func_alpha, + texture_type, bin_size, max_elems_per_bin, + max_faces_per_pixel_for_grad) + else: + raise ValueError("dr_type should be one of None, 'softras' or 'n3mr'") + + def set_sigma(self, sigma): + self.rasterizer.sigma_val = sigma + + def set_gamma(self, gamma): + self.rasterizer.gamma_val = gamma + + def set_texture_mode(self, mode): + assert mode in ['vertex', 'surface'], 'Mode only support surface and vertex' + + self.lighting.light_mode = mode + self.rasterizer.texture_type = mode + + def render_mesh(self, mesh, mode='rgb'): + self.set_texture_mode(mesh.texture_type) + mesh = self.lighting(mesh, self.transform.eyes) + mesh = self.transform(mesh) + return self.rasterizer(mesh, mode) + + + def execute(self, vertices, faces, textures=None,mode='rgb', texture_type='surface', metallic_textures=None, roughness_textures=None): + mesh = jr.Mesh(vertices, faces, textures=textures, texture_type=texture_type, metallic_textures=metallic_textures, roughness_textures=roughness_textures) + return self.render_mesh(mesh, mode) diff --git a/jrender/renderer/transform/__init__.py b/jrender/renderer/transform/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/transform/look.py b/jrender/renderer/transform/look.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/transform/look_at.py b/jrender/renderer/transform/look_at.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/transform/orthogonal.py b/jrender/renderer/transform/orthogonal.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/transform/perspective.py b/jrender/renderer/transform/perspective.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/transform/projection.py b/jrender/renderer/transform/projection.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/transform/transform.py b/jrender/renderer/transform/transform.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/utils/ToStretchMap.py b/jrender/renderer/utils/ToStretchMap.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/utils/__init__.py b/jrender/renderer/utils/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/utils/cuda/voxelization.py b/jrender/renderer/utils/cuda/voxelization.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/utils/gaussian_blur.py b/jrender/renderer/utils/gaussian_blur.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/utils/get_points_from_angles.py b/jrender/renderer/utils/get_points_from_angles.py old mode 100644 new mode 100755 diff --git a/jrender/renderer/utils/voxelization.py b/jrender/renderer/utils/voxelization.py old mode 100644 new mode 100755 diff --git a/jrender/structures/__init__.py b/jrender/structures/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/structures/mesh.py b/jrender/structures/mesh.py old mode 100644 new mode 100755 diff --git a/jrender/structures/utils/__init__.py b/jrender/structures/utils/__init__.py old mode 100644 new mode 100755 diff --git a/jrender/structures/utils/faces_vertices.py b/jrender/structures/utils/faces_vertices.py old mode 100644 new mode 100755 diff --git a/jrender_vol/__init__.py b/jrender_vol/__init__.py old mode 100644 new mode 100755 diff --git a/jrender_vol/camera/__init__.py b/jrender_vol/camera/__init__.py old mode 100644 new mode 100755 diff --git a/jrender_vol/camera/pinhole.py b/jrender_vol/camera/pinhole.py old mode 100644 new mode 100755 diff --git a/jrender_vol/integrator/__init__.py b/jrender_vol/integrator/__init__.py old mode 100644 new mode 100755 diff --git a/jrender_vol/integrator/integrator.py b/jrender_vol/integrator/integrator.py old mode 100644 new mode 100755 diff --git a/jrender_vol/integrator/sample.py b/jrender_vol/integrator/sample.py old mode 100644 new mode 100755 diff --git a/jrender_vol/rayMarching/__init__.py b/jrender_vol/rayMarching/__init__.py old mode 100644 new mode 100755 diff --git a/jrender_vol/rayMarching/rayMarching.py b/jrender_vol/rayMarching/rayMarching.py old mode 100644 new mode 100755 diff --git a/jrender_vol/renderPass/__init__.py b/jrender_vol/renderPass/__init__.py old mode 100644 new mode 100755 diff --git a/jrender_vol/renderPass/render.py b/jrender_vol/renderPass/render.py old mode 100644 new mode 100755 diff --git a/nerf_helper/__init__.py b/nerf_helper/__init__.py old mode 100644 new mode 100755 diff --git a/nerf_helper/load_blender.py b/nerf_helper/load_blender.py old mode 100644 new mode 100755 diff --git a/nerf_helper/load_deepvoxels.py b/nerf_helper/load_deepvoxels.py old mode 100644 new mode 100755 diff --git a/nerf_helper/load_llff.py b/nerf_helper/load_llff.py old mode 100644 new mode 100755 diff --git a/nerf_helper/utils.py b/nerf_helper/utils.py old mode 100644 new mode 100755 diff --git a/requirements.txt b/requirements.txt old mode 100644 new mode 100755